57 lines
1.6 KiB
Python
Executable File
57 lines
1.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
from pdf_data import get_destination_pdf, get_page_pdf, get_section_pdf
|
|
from datatypes import *
|
|
from enum import Enum, auto
|
|
from util import notify
|
|
import subprocess
|
|
import argparse
|
|
import formatter.typst as typst_fmt
|
|
|
|
parser = argparse.ArgumentParser()
|
|
dest_group = parser.add_mutually_exclusive_group()
|
|
dest_group.add_argument("--section", help="Copy reference to the section title instead of the page number.", action="store_true")
|
|
dest_group.add_argument("--destination", help="Copy reference to a named destination instead of the page number.", action="store_true")
|
|
|
|
|
|
class LinkFormat(Enum):
|
|
TYPST = auto()
|
|
|
|
|
|
def clip_copy(txt: str):
|
|
try:
|
|
subprocess.run(["xsel", "-ib"], text=True, input=txt)
|
|
except OSError as e:
|
|
raise Exception("Please install `xsel`.") from e
|
|
|
|
|
|
def copy_ref(ref: Reference, format: LinkFormat) -> None:
|
|
"""Formats Reference and copies it to clipboard."""
|
|
match format:
|
|
case LinkFormat.TYPST:
|
|
link_txt = typst_fmt.ref(ref)
|
|
|
|
clip_copy(link_txt)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
args = parser.parse_args()
|
|
|
|
if args.section:
|
|
ref = get_section_pdf()
|
|
elif args.destination:
|
|
ref = get_destination_pdf()
|
|
else:
|
|
ref = get_page_pdf()
|
|
|
|
format = LinkFormat.TYPST
|
|
copy_ref(ref, format)
|
|
|
|
match ref:
|
|
case PDFPage():
|
|
notify("Copied ref", f"{ref.filepath.name} p. {ref.page}")
|
|
case PDFSection():
|
|
notify("Copied ref", f"{ref.filepath.name} sec. {ref.title}")
|
|
case PDFDestination():
|
|
notify("Copied ref", f"{ref.filepath.name} {ref.name}")
|