firefox-web-apps/fwa/setup.py

149 lines
4.4 KiB
Python

from pathlib import Path
import subprocess
from typing import Annotated, Optional
from prompt_toolkit import prompt
from prompt_toolkit.completion import PathCompleter
import typer
from fwa.config import FIREFOX_BINARY, Config
from fwa.log import err, out
from fwa.validation import BoolStrValidator, ProfilePathValidator, str_to_bool
DEFAULT_PROFILE_NAME = "firefox-web-apps"
def bool_prompt(message: str, default: Optional[bool] = None) -> bool:
return str_to_bool(
prompt(
message,
validator=BoolStrValidator(default=default),
),
default=default,
)
def enable_user_chrome(profile: Path):
with open(profile / "user.js", "a") as f:
f.write("\n")
f.write(
'user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);'
)
f.write("\n")
def configure_user_chrome(
profile: Path, hide_tabs: bool, hide_main_toolbar: bool, disable_url_bar: bool
):
chrome_dir = profile / "chrome"
if not chrome_dir.exists():
chrome_dir.mkdir()
v_collapse = []
if hide_tabs:
v_collapse.append("#tabbrowser-tabs")
v_collapse.append("#TabsToolbar")
if hide_main_toolbar:
v_collapse.append("#nav-bar")
with open(chrome_dir / "userChrome.css", "a") as f:
if v_collapse:
f.write(", ".join(v_collapse))
f.write("{ visibility: collapse !important; }\n")
if disable_url_bar:
f.write(".urlbarView { display: none !important; }\n")
f.write(".urlbar-input-box { visibility: hidden !important; }\n")
def setup(
firefox_profile: Annotated[
Optional[Path],
typer.Option(
"-f", "--firefox-profile", help="Path to existing firefox profile"
),
] = None,
new_profile_name: Annotated[
Optional[str],
typer.Option("-n", "--new-profile", help="Name for a new firefox profile"),
] = None,
):
"""
This program will optionally create a firefox profile and configure it to
use with Firefox Web Apps
"""
if firefox_profile is None:
if new_profile_name is None:
# prompt for new profile name
use_existing = bool_prompt(
"Use an existing profile for apps? (y/N):", False
)
if use_existing:
firefox_profile = Path(
prompt(
"Enter path to existing profile: ",
validator=ProfilePathValidator,
completer=PathCompleter(),
complete_while_typing=True,
)
)
else:
new_profile_name = DEFAULT_PROFILE_NAME
if new_profile_name:
firefox_profile = Path.home() / ".mozilla" / "firefox" / new_profile_name
if firefox_profile.exists():
err.print(
f"[red bold]Firefox Profile {str(firefox_profile)!r} already exists"
)
raise typer.Exit(code=1)
out.print("[green]Creating Firefox Profile.")
subprocess.run(
[
FIREFOX_BINARY,
"-CreateProfile",
f"{new_profile_name} {firefox_profile}",
]
)
out.print("[green]Created Firefox Profile")
else:
if not firefox_profile.exists():
err.print(f"[red bold]{str(firefox_profile)!r} does not exist")
raise typer.Exit(code=1)
if not firefox_profile.is_dir():
err.print(f"[red bold]{str(firefox_profile)!r} is not a directory")
raise typer.Exit(code=1)
out.print("[green]Writing config...\n")
Config.conf["firefox-profile"] = str(firefox_profile)
Config.write_config()
out.print("[green]Enabling userChrome.css support...\n")
enable_user_chrome(firefox_profile)
out.print("[green]Configuring userChrome.css...\n")
hide_tabs = bool_prompt("Do you want to hide tabs? (Y/n)", True)
if hide_main_toolbar := bool_prompt("Do you want to hide main toolbar? (y/N)", False):
hide_url_bar = False
else:
hide_url_bar = bool_prompt("Do you want to disable the URL bar? (Y/n)", True)
configure_user_chrome(
firefox_profile,
hide_tabs,
hide_main_toolbar,
hide_url_bar,
)
def main():
typer.run(setup)