| #!/usr/bin/env python3 |
| """Re-apply IDS-local patches to the vendored reveal.js bundle. |
| |
| Run after every reveal.js update (see tools/update-reveal.R): |
| |
| python3 tools/patch-revealjs.py |
| |
| Every patch is an exact-string replacement keyed to the minified upstream |
| code. If a newer reveal.js refactors the surroundings, the script fails |
| loudly instead of skipping silently -- port the patch by hand, then update |
| the pattern here. Safe to run repeatedly (already-applied patches are |
| detected and skipped). |
| """ |
| import sys |
| from pathlib import Path |
| |
| REPO = Path(__file__).resolve().parent.parent |
| |
| # Patch name -> [(upstream snippet, patched snippet), ...] |
| PATCHES = { |
| # Upstream toggles the help overlay only on the US-layout keyCodes for '?' |
| # (63/191) + shift, and an earlier modifier guard swallows unknown keyCodes |
| # held with shift outright. On e.g. a German layout ('?' = Shift+ss) Chrome |
| # reports neither keyCode, so '?' never opened the help screen there. |
| # Match the produced character (event.key) instead; F1 keeps working. |
| "help overlay on non-US keyboard layouts ('?' via event.key)": [ |
| ( |
| 'l=!(-1!==[32,37,38,39,40,63,78,80,191].indexOf(e.keyCode)&&e.shiftKey||e.altKey)&&(e.shiftKey||e.altKey||e.ctrlKey||e.metaKey)', |
| 'l=!(-1!==[32,37,38,39,40,63,78,80,191].indexOf(e.keyCode)&&e.shiftKey||e.altKey)&&(e.shiftKey||e.altKey||e.ctrlKey||e.metaKey)&&"?"!==e.key', |
| ), |
| ( |
| ':63!==i&&191!==i||!e.shiftKey?112===i?this.Reveal.toggleHelp():u=!1:this.Reveal.toggleHelp())', |
| ':"?"!==e.key&&(!e.shiftKey||63!==i&&191!==i)?112===i?this.Reveal.toggleHelp():u=!1:this.Reveal.toggleHelp())', |
| ), |
| ], |
| } |
| |
| |
| def main(): |
| bundles = sorted((REPO / "inst").glob("reveal.js-*/dist/reveal.js")) |
| if len(bundles) != 1: |
| sys.exit(f"expected exactly one vendored reveal.js, found: {bundles}") |
| path = bundles[0] |
| original = src = path.read_text() |
| |
| for name, pairs in PATCHES.items(): |
| for old, new in pairs: |
| if new in src: |
| print(f"already applied: {name}") |
| elif old in src: |
| src = src.replace(old, new, 1) |
| print(f"applied: {name}") |
| else: |
| sys.exit( |
| f"UPSTREAM CHANGED -- cannot locate pattern for patch:\n" |
| f" {name}\n" |
| f" missing snippet starts with: {old[:70]}...\n" |
| f"Port the patch by hand, then update tools/patch-revealjs.py." |
| ) |
| |
| if src != original: |
| path.write_text(src) |
| print(f"written: {path}") |
| else: |
| print("nothing to do") |
| |
| |
| if __name__ == "__main__": |
| main() |