mirror of
https://github.com/Aider-AI/aider.git
synced 2025-05-29 08:44:59 +00:00
124 lines
4.3 KiB
Python
124 lines
4.3 KiB
Python
|
|
from PIL import Image, ImageDraw, ImageFont
|
|
import os
|
|
|
|
# --- Configuration ---
|
|
WIDTH = 1200 # Twitter card image width
|
|
HEIGHT = 675 # Twitter card image height
|
|
BG_COLOR = "#282a36" # Aider code background color
|
|
PRIMARY_COLOR = "#14b014" # Aider terminal green
|
|
TEXT_COLOR = "#FFFFFF" # White for contrast
|
|
FONT_SIZE_LARGE = 110
|
|
FONT_SIZE_MEDIUM = 55
|
|
FONT_SIZE_SMALL = 30
|
|
OUTPUT_FILENAME = "aider_30k_stars_celebration.png"
|
|
|
|
# --- Paths (Adjust if needed) ---
|
|
# Assumes the script is run from the root of the aider repo
|
|
LOGO_PATH = "aider/website/assets/logo.png" # NEEDS TO BE PNG, not SVG!
|
|
# Try to find a suitable bold font. Adjust path if necessary, or install one.
|
|
# Common locations/names:
|
|
FONT_PATHS_BOLD = [
|
|
"DejaVuSans-Bold.ttf", # Common on Linux
|
|
"/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf",
|
|
"Arial Bold.ttf", # Common on Windows/macOS
|
|
"/System/Library/Fonts/Supplemental/Arial Bold.ttf",
|
|
"arialbd.ttf",
|
|
]
|
|
FONT_PATHS_REGULAR = [
|
|
"DejaVuSans.ttf",
|
|
"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
|
|
"Arial.ttf",
|
|
"/System/Library/Fonts/Supplemental/Arial.ttf",
|
|
"arial.ttf",
|
|
]
|
|
|
|
# --- Helper Function to Find Font ---
|
|
def find_font(font_paths, default_size):
|
|
for path in font_paths:
|
|
try:
|
|
return ImageFont.truetype(path, default_size)
|
|
except IOError:
|
|
continue # Try next path
|
|
print(f"Warning: Could not find any of the preferred fonts: {font_paths}. Using default.")
|
|
# Pillow's default font doesn't support sizing well, return None to handle later
|
|
return None
|
|
|
|
# --- Load Fonts ---
|
|
font_large = find_font(FONT_PATHS_BOLD, FONT_SIZE_LARGE)
|
|
font_medium = find_font(FONT_PATHS_BOLD, FONT_SIZE_MEDIUM)
|
|
font_small = find_font(FONT_PATHS_REGULAR, FONT_SIZE_SMALL)
|
|
|
|
# Use Pillow's basic default only if absolutely necessary (will look bad)
|
|
if not font_large: font_large = ImageFont.load_default()
|
|
if not font_medium: font_medium = ImageFont.load_default()
|
|
if not font_small: font_small = ImageFont.load_default()
|
|
|
|
|
|
# --- Create Base Image ---
|
|
image = Image.new('RGB', (WIDTH, HEIGHT), color=BG_COLOR)
|
|
draw = ImageDraw.Draw(image)
|
|
|
|
# --- Load and Place Logo (Optional) ---
|
|
logo_img = None
|
|
logo_height = 0
|
|
logo_y_pos = HEIGHT * 0.15 # Start logo about 15% down
|
|
try:
|
|
if os.path.exists(LOGO_PATH):
|
|
logo_img = Image.open(LOGO_PATH)
|
|
# Resize logo to fit nicely, maintaining aspect ratio
|
|
max_logo_h = 120
|
|
if logo_img.height > max_logo_h:
|
|
ratio = max_logo_h / logo_img.height
|
|
new_w = int(logo_img.width * ratio)
|
|
logo_img = logo_img.resize((new_w, max_logo_h), Image.Resampling.LANCZOS)
|
|
|
|
logo_height = logo_img.height
|
|
logo_x = (WIDTH - logo_img.width) // 2
|
|
# Paste logo, handling transparency if PNG has alpha channel
|
|
if logo_img.mode == 'RGBA':
|
|
image.paste(logo_img, (logo_x, int(logo_y_pos)), logo_img)
|
|
else:
|
|
image.paste(logo_img, (logo_x, int(logo_y_pos)))
|
|
print(f"Logo loaded from {LOGO_PATH}")
|
|
else:
|
|
print(f"Info: Logo not found at {LOGO_PATH}, skipping logo.")
|
|
logo_y_pos = HEIGHT * 0.1 # Start text higher if no logo
|
|
except Exception as e:
|
|
print(f"Warning: Could not load or process logo: {e}")
|
|
logo_img = None
|
|
logo_y_pos = HEIGHT * 0.1 # Start text higher if no logo
|
|
|
|
# --- Text Content ---
|
|
line1 = "Thank You!"
|
|
line2 = "30,000"
|
|
line3 = "GitHub Stars"
|
|
line4 = "github.com/Aider-AI/aider"
|
|
|
|
# --- Calculate Text Positions ---
|
|
center_x = WIDTH / 2
|
|
current_y = logo_y_pos + logo_height + 40 # Start text below logo (or top if no logo)
|
|
|
|
# --- Draw Text ---
|
|
# Line 1: "Thank You!"
|
|
draw.text((center_x, current_y), line1, fill=TEXT_COLOR, font=font_medium, anchor="mt")
|
|
current_y += FONT_SIZE_MEDIUM + 30
|
|
|
|
# Line 2: "30,000"
|
|
draw.text((center_x, current_y), line2, fill=PRIMARY_COLOR, font=font_large, anchor="mt")
|
|
current_y += FONT_SIZE_LARGE + 15
|
|
|
|
# Line 3: "GitHub Stars"
|
|
draw.text((center_x, current_y), line3, fill=TEXT_COLOR, font=font_medium, anchor="mt")
|
|
current_y += FONT_SIZE_MEDIUM + 60
|
|
|
|
# Line 4: Repo URL (smaller at bottom)
|
|
draw.text((center_x, HEIGHT - FONT_SIZE_SMALL - 30), line4, fill=TEXT_COLOR, font=font_small, anchor="mb")
|
|
|
|
|
|
# --- Save Image ---
|
|
try:
|
|
image.save(OUTPUT_FILENAME)
|
|
print(f"Celebration image saved as '{OUTPUT_FILENAME}'")
|
|
except Exception as e:
|
|
print(f"Error saving image: {e}")
|