# -*- coding: utf-8 -*- # # Copyright (C) 2019 Cole Helbling # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Changelog: # 2019-12-14, Cole Helbling # version 1.0: initial release SCRIPT_NAME = "styurl" SCRIPT_AUTHOR = "Cole Helbling " SCRIPT_VERSION = "1.0" SCRIPT_LICENSE = "GPL3" SCRIPT_DESC = "Style URLs with a Python regex" import_ok = True try: import weechat as w except ImportError: print("This script must be run under WeeChat.") print("Get WeeChat now at: https://weechat.org") import_ok = False try: import re except ImportError as message: print("Missing package for %s: %s" % (SCRIPT_NAME, message)) import_ok = False # https://mathiasbynens.be/demo/url-regex # If you don't want to create your own regex, see the above link for options or # ideas on creating your own styurl_settings = { "buffer_type": ( "formatted", "the type of buffers to run on (options are \"formatted\", \"free\", " "or \"*\" for both)" ), "format": ( "${color:*_32}", "the style that should be applied to the URL" "(evaluated, see /help eval)" ), "ignored_buffers": ( "core.weechat,python.grep", "comma-separated list of buffers to ignore URLs in " "(full name like \"irc.freenode.#alacritty\")" ), "ignored_tags": ( "irc_quit,irc_join", "comma-separated list of tags to ignore URLs from" ), "regex": ( r"((?:https?|ftp)://[^\s/$.?#].\S*)", "the URL-parsing regex using Python syntax " "(make sure capturing group 1 is the full URL)" ), } line_hook = None def styurl_line_cb(data, line): """ Callback called when a line is displayed. This parses the message for any URLs and styles them according to styurl_settings["format"]. """ global styurl_settings # Don't style the line if it's not going to be displayed... duh if line["displayed"] != "1": return line tags = line["tags"].split(',') ignored_tags = styurl_settings["ignored_tags"] # Ignore specified message tags if ignored_tags: if any(tag in tags for tag in ignored_tags.split(',')): return line bufname = line["buffer_name"] ignored_buffers = styurl_settings["ignored_buffers"] # Ignore specified buffers if ignored_buffers and bufname in ignored_buffers.split(','): return line message = line["message"] # TODO: enforce presence of a properly-formatted color object at # styurl_settings["format"] (eval object would also be valid, if it eval'd # to a color) regex = re.compile(styurl_settings["regex"]) url_style = w.string_eval_expression(styurl_settings["format"], {}, {}, {}) reset = w.color("reset") # Search for URLs and surround them with the defined URL styling formatted = regex.sub(r"%s\1%s" % (url_style, reset), message) line["message"] = line["message"].replace(message, formatted) return line def styurl_config_cb(data, option, value): """Callback called when a script option is changed.""" global styurl_settings, line_hook pos = option.rfind('.') if pos > 0: name = option[pos+1:] if name in styurl_settings: # Changing the buffer target requires us to re-hook to prevent # obsolete buffer types from getting styled if name == "buffer_type": if value in ("free", "formatted", "*"): w.unhook(line_hook) line_hook = w.hook_line(value, "", "", "styurl_line_cb", "") else: # Don't change buffer type if it is invalid w.prnt("", SCRIPT_NAME + ": Invalid buffer type: '%s', " "not changing." % value) w.config_set_plugin(name, styurl_settings[name]) return w.WEECHAT_RC_ERROR styurl_settings[name] = value return w.WEECHAT_RC_OK def styurl_unload_cb(): """Callback called when the script is unloaded.""" global line_hook w.unhook(line_hook) del line_hook return w.WEECHAT_RC_OK if __name__ == "__main__" and import_ok: if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, "styurl_unload_cb", ""): version = w.info_get("version_number", "") or 0 for option, value in styurl_settings.items(): if w.config_is_set_plugin(option): styurl_settings[option] = w.config_get_plugin(option) else: w.config_set_plugin(option, value[0]) styurl_settings[option] = value[0] if int(version) >= 0x00030500: w.config_set_desc_plugin(option, "%s (default: \"%s\")" % (value[1], value[0])) w.hook_config("plugins.var.python." + SCRIPT_NAME + ".*", "styurl_config_cb", "") # Style URLs line_hook = w.hook_line(styurl_settings["buffer_type"], "", "", "styurl_line_cb", "")