| #!/usr/bin/env python3 |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| # |
| # /// script |
| # requires-python = ">=3.11" |
| # dependencies = [ |
| # "rich>=14.0.0", |
| # ] |
| # /// |
| |
| import shutil |
| import argparse |
| from pathlib import Path |
| |
| from rich.console import Console |
| |
| console = Console(width=200, color_system="standard") |
| |
| CSS_TO_ADD = """ |
| .td-main, .roadmap { |
| position: relative; /* Ensures the pseudo-element is positioned relative to the main content */ |
| } |
| |
| .td-main::before, |
| .roadmap::before { |
| content: ""; |
| position: absolute; |
| top: 0; |
| left: 0; |
| width: 100%; |
| height: 100%; |
| background: url(URL_PREFIX/staging.png) repeat center center fixed; /* Sets the background image */ |
| opacity: 0.2; /* Makes the watermark semi-transparent */ |
| pointer-events: none; /* Ensures the watermark doesn't interfere with user interactions */ |
| z-index: -1; /* Places the pseudo-element behind all other elements */ |
| } |
| |
| /* Dark mode support - increases watermark visibility */ |
| [data-theme="dark"] .td-main::before, |
| [data-theme="dark"] .roadmap::before, |
| [data-bs-theme="dark"] .td-main::before, |
| [data-bs-theme="dark"] .roadmap::before, |
| .dark .td-main::before, |
| .dark .roadmap::before, |
| .dark-mode .td-main::before { |
| .dark-mode .roadmap::before { |
| opacity: 0.2; /* Higher opacity for dark mode visibility */ |
| filter: invert(1) brightness(2); /* Inverts colors for dark background */ |
| z-index: 1; |
| } |
| """ |
| |
| |
| IMAGE_FILE=Path(__file__).parent / "images" / "staging.png" |
| |
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser(description="Add watermark") |
| parser.add_argument("--folder", required=True, help="Folder to look for css files for") |
| parser.add_argument("--pattern", required=True, help="Glob pattern to look for") |
| parser.add_argument("--url-prefix", required=True, help="URL prefix to use for the image") |
| parser.add_argument("--image-directory", required=True, |
| help="Image directory where image should be written-relative to folder path.") |
| console.print("[bright_blue]Adding watermark to the site's CSS") |
| args = parser.parse_args() |
| |
| folder_path = Path(args.folder) |
| pattern = args.pattern |
| url_prefix = args.url_prefix |
| image_directory_path = Path(args.image_directory) |
| |
| content_to_add = CSS_TO_ADD.replace("URL_PREFIX", url_prefix) |
| console.print(f"[bright_blue]Looking for css files following '{pattern}' pattern[/] in {folder_path}") |
| files = folder_path.rglob(pattern) |
| if not files: |
| console.print(f"[red]No files found with pattern {pattern} in {folder_path}") |
| else: |
| for file in files: |
| content = file.read_text() |
| if not "watermark semi-transparent" in content: |
| console.print(f"[yellow]Adding watermark to:[/] {file}") |
| content = content + content_to_add |
| file.write_text(content) |
| target_image_location = folder_path / image_directory_path |
| console.print(f"[yellow]Creating staging image at :[/]:{target_image_location}/staging.png") |
| target_image_location.mkdir(parents=True, exist_ok=True) |
| shutil.copy(IMAGE_FILE, target_image_location / "staging.png") |