# -*- coding: utf-8 -*-
|
|
#
|
|
# Copyright (C) 2019 Cole Helbling <cole.e.helbling@outlook.com>
|
|
#
|
|
# 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 <http://www.gnu.org/licenses/>.
|
|
#
|
|
|
|
# Changelog:
|
|
# 2019-12-14, Cole Helbling <cole.e.helbling@outlook.com>
|
|
# version 1.0: initial release
|
|
|
|
SCRIPT_NAME = "styurl"
|
|
SCRIPT_AUTHOR = "Cole Helbling <cole.e.helbling@outlook.com>"
|
|
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", "")
|