#!/usr/bin/env python3

import os
import html
import re
import sys
import xml.etree.ElementTree as ET

try:
    import pyperclip
except ImportError:
    PYPERCLIP = False
else:
    PYPERCLIP = True


def parse_text_content(element) -> str:
    root = ET.fromstring(element)
    text = ET.tostring(root, encoding="unicode", method="text")
    text = html.unescape(text)
    return text


def send_command_to_qute(command) -> None:
    if fifo := os.environ.get("QUTE_FIFO"):
        with open(fifo, "w") as f:
            f.write(command)


def main():
    delimiter = sys.argv[1] if len(sys.argv) > 1 else ";"
    # For info on qute environment vairables, see
    # https://github.com/qutebrowser/qutebrowser/blob/master/doc/userscripts.asciidoc
    element = os.environ.get("QUTE_SELECTED_HTML")
    code_text = parse_text_content(element)
    if pyperclip and PYPERCLIP:
        pyperclip.copy(code_text)
        send_command_to_qute(
            "message-info 'copied to clipboard: {info}{suffix}'".format(
                info=code_text.splitlines()[0],
                suffix="..." if len(code_text.splitlines()) > 1 else "",
            )
        )
    else:
        # Qute's yank command  won't copy accross multiple lines so we
        # compromise by placing lines on a single line seperated by the
        # specified delimiter
        code_text = re.sub("(\n)+", delimiter, code_text)
        code_text = code_text.replace("'", '"')
        send_command_to_qute("yank inline '{code}'\n".format(code=code_text))


if __name__ == "__main__":
    main()
