summaryrefslogtreecommitdiff
path: root/plugins/link.py
blob: a51a8bef5ffd7462a0486cbadd160d87ae1c09b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
"""
Opens links in a browser.

Installation
------------

First use case: local use
~~~~~~~~~~~~~~~~~~~~~~~~~
If you use poezio on your workstation, this is for you.
You only have to load the plugin: ::

    /load link

Second use case: remote use
~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you use poezio through SSH, this is for you.

.. note:: Small explanation: Poezio will create a `Unix FIFO`_ and send the commands in,
            and you will have to run a dæmon locally with ssh, to get those commands.

First, set the :term:`exec_remote` option in the config file to ``true``. Then select
the directory you want to put the fifo in (default is the current
directory, :file:`./`), the :file:`poezio.fifo` file will be created there.

After that, load the plugin: ::

    /load link

And open a link with :term:`/link` (as described below), this will create the FIFO.

You need to grab poezio’s sources on your client computer, or at least the `daemon.py`_
file.

Finally, on your client computer, run the ssh command:

.. code-block:: bash

    ssh toto@example.org "cat ~/poezio/poezio.fifo" | python3 daemon.py

Usage
-----

.. glossary::

    /link
        **Usage:** ``/link [num]``

        This plugin adds a :term:`/link` command that will open the links in ``firefox``. If
        you want to use another browser, you can use the :term:`/set` command  to change the
        :term:`browser` option.


        :term:`/link` without argument will open the last received link, if any is found.
        If an integer argument is given, /link will go back gradually in the buffer
        to open the previous link, and so on.


        If you are scrolling in the buffer, poezio will open the links starting from
        the first you can see. (although there are some problems with multiline
        messages).

Options
-------

:term:`exec_remote`

    To execute the command on your client

.. glossary::

    browser
        Set the default browser started by the plugin

.. _Unix FIFO: https://en.wikipedia.org/wiki/Named_pipe
.. _daemon.py: http://gitweb.louiz.org/?p=poezio;a=blob_plain;f=src/daemon.py;hb=HEAD

"""
import re

from plugin import BasePlugin
from xhtml import clean_text
import common
import tabs

url_pattern = re.compile(r'\b(http[s]?://(?:\S+))\b', re.I|re.U)

class Plugin(BasePlugin):
    def init(self):
        for _class in (tabs.MucTab, tabs.PrivateTab, tabs.ConversationTab):
            self.api.add_tab_command(_class, 'link', self.command_link,
                    usage='[num]',
                    help='Opens the last link from the conversation into a browser.\nIf [num] is given, then it will open the num-th link displayed.',
                    short='Open links into a browser')

    def find_link(self, nb):
        messages = self.api.get_conversation_messages()
        if not messages:
            return None
        for message in messages[::-1]:
            matches = url_pattern.findall(clean_text(message.txt))
            if matches:
                for url in matches[::-1]:
                    if nb == 1:
                        return url
                    else:
                        nb -= 1
        return None

    def command_link(self, args):
        args = common.shell_split(args)
        if len(args) == 1:
            try:
                nb = int(args[0])
            except:
                return self.api.run_command('/help link')
        else:
            nb = 1
        link = self.find_link(nb)
        if link:
            self.core.exec_command([self.config.get('browser', 'firefox'), link])
        else:
            self.api.information('No URL found.', 'Warning')

    def cleanup(self):
        del self.config