Another copy of my dotfiles. Because I don't completely trust GitHub.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

178 lines
5.7 KiB

# -*- 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", "")