]> git.rmz.io Git - dotfiles.git/blob - weechat/python/text_item.py
weechat: delete beep.pl (its been integrated upstream)
[dotfiles.git] / weechat / python / text_item.py
1 # -*- coding: utf-8 -*-
2 #
3 # Copyright (c) 2012-2018 by nils_2 <weechatter@arcor.de>
4 #
5 # add a plain text or evaluated content to item bar
6 #
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 # 2018-08-18: nils_2, (freenode.#weechat)
21 # 0.8 : add new option "interval"
22 #
23 # 2017-08-23: nils_2, (freenode.#weechat)
24 # 0.7.1 : improve /help text
25 #
26 # 2017-08-19: nils_2, (freenode.#weechat)
27 # 0.7 : add type "!all", internal changes
28 #
29 # 2016-12-12: nils_2, (freenode.#weechat)
30 # 0.6 : fix problem with multiple windows (reported by Ram-Z)
31 #
32 # 2016-09-15: nils_2, (freenode.#weechat)
33 # 0.5 : add /help text (suggested by gb)
34 #
35 # 2014-05-19: nils_2, (freenode.#weechat)
36 # 0.4 : evaluate content of item (suggested by FlashCode)
37 #
38 # 2013-06-27: nils_2, (freenode.#weechat)
39 # 0.3 : fix: bug with root bar
40 #
41 # 2013-01-25: nils_2, (freenode.#weechat)
42 # 0.2 : make script compatible with Python 3.x
43 #
44 # 2012-12-23: nils_2, (freenode.#weechat)
45 # 0.1 : initial release
46 #
47 # requires: WeeChat version 0.3.0
48 #
49 # Development is currently hosted at
50 # https://github.com/weechatter/weechat-scripts
51
52 try:
53 import weechat,re
54
55 except Exception:
56 print("This script must be run under WeeChat.")
57 print("Get WeeChat now at: http://www.weechat.org/")
58 quit()
59
60 SCRIPT_NAME = "text_item"
61 SCRIPT_AUTHOR = "nils_2 <weechatter@arcor.de>"
62 SCRIPT_VERSION = "0.8"
63 SCRIPT_LICENSE = "GPL"
64 SCRIPT_DESC = "add a plain text or evaluated content to item bar"
65
66 # regexp to match ${color} tags
67 regex_color=re.compile('\$\{([^\{\}]+)\}')
68
69 hooks = {}
70 TIMER = None
71
72 settings = {
73 'interval': ('0', 'How often (in seconds) to force an update of all items. 0 means deactivated'),
74 }
75
76 # ================================[ hooks ]===============================
77 def add_hook(signal, item):
78 global hooks
79 # signal already exists?
80 if signal in hooks:
81 return
82 hooks[item] = weechat.hook_signal(signal, "bar_item_update_cb", "")
83
84 def unhook(hook):
85 global hooks
86 if hook in hooks:
87 weechat.unhook(hooks[hook])
88 del hooks[hook]
89
90 def toggle_refresh_cb(pointer, name, value):
91 option_name = name[len('plugins.var.python.' + SCRIPT_NAME + '.'):] # get optionname
92
93 # check for timer hook
94 if name.endswith(".interval"):
95 set_timer()
96 return weechat.WEECHAT_RC_OK
97
98 # option was removed? remove bar_item from struct
99 if not weechat.config_get_plugin(option_name):
100 ptr_bar = weechat.bar_item_search(option_name)
101 if ptr_bar:
102 weechat.bar_item_remove(ptr_bar)
103 return weechat.WEECHAT_RC_OK
104
105 # check if option is new or changed
106 if not weechat.bar_item_search(option_name):
107 weechat.bar_item_new(option_name,'update_item',option_name)
108
109 weechat.bar_item_update(option_name)
110 return weechat.WEECHAT_RC_OK
111
112 def set_timer():
113 # Update timer hook with new interval. 0 means deactivated
114 global TIMER
115 if TIMER:
116 weechat.unhook(TIMER)
117 if int(weechat.config_get_plugin('interval')) >= 1:
118 TIMER = weechat.hook_timer(int(weechat.config_get_plugin('interval')) * 1000,0, 0, "timer_dummy_cb", '')
119
120 def timer_dummy_cb(data, remaining_calls):
121 # hook_timer() has two arguments, hook_signal() needs three arguments
122 bar_item_update_cb("","","")
123 return weechat.WEECHAT_RC_OK
124
125 # ================================[ items ]===============================
126 def create_bar_items():
127 ptr_infolist_option = weechat.infolist_get('option','','plugins.var.python.' + SCRIPT_NAME + '.*')
128
129 if not ptr_infolist_option:
130 return
131
132 while weechat.infolist_next(ptr_infolist_option):
133 option_full_name = weechat.infolist_string(ptr_infolist_option, 'full_name')
134 option_name = option_full_name[len('plugins.var.python.' + SCRIPT_NAME + '.'):] # get optionname
135
136 if weechat.bar_item_search(option_name):
137 weechat.bar_item_update(option_name)
138 else:
139 weechat.bar_item_new(option_name,'update_item',option_name)
140 weechat.bar_item_update(option_name)
141
142 weechat.infolist_free(ptr_infolist_option)
143
144 def update_item (data, item, window):
145 if not data:
146 return ""
147
148 # window empty? root bar!
149 if not window:
150 window = weechat.current_window()
151
152 value = weechat.config_get_plugin(data)
153 if not value:
154 return ""
155
156 value = check_buffer_type(window, data, value)
157
158 return substitute_colors(value,window)
159
160 # update item from weechat.hook_signal()
161 def bar_item_update_cb(signal, callback, callback_data):
162 ptr_infolist_option = weechat.infolist_get('option','','plugins.var.python.' + SCRIPT_NAME + '.*')
163
164 if not ptr_infolist_option:
165 return
166
167 while weechat.infolist_next(ptr_infolist_option):
168 option_full_name = weechat.infolist_string(ptr_infolist_option, 'full_name')
169 option_name = option_full_name[len('plugins.var.python.' + SCRIPT_NAME + '.'):] # get optionname
170 if option_name == "interval":
171 continue
172
173 # check if item exists in a bar and if we have a hook for it
174 if weechat.bar_item_search(option_name) and option_name in hooks:
175 weechat.bar_item_update(option_name)
176
177 weechat.infolist_free(ptr_infolist_option)
178
179 return weechat.WEECHAT_RC_OK
180
181
182 # ================================[ subroutines ]===============================
183 def substitute_colors(text,window):
184 if int(version) >= 0x00040200:
185 bufpointer = weechat.window_get_pointer(window,"buffer")
186 return weechat.string_eval_expression(text, {"buffer": bufpointer}, {}, {})
187 # return weechat.string_eval_expression(text,{},{},{})
188 # substitute colors in output
189 return re.sub(regex_color, lambda match: weechat.color(match.group(1)), text)
190
191 def check_buffer_type(window, data, value):
192 bufpointer = weechat.window_get_pointer(window,"buffer")
193 if bufpointer == "":
194 return ""
195
196 value = value.split(' ', 1)
197 if len(value) <= 1:
198 return ""
199
200 # format is : buffer_type (channel,server,private,all) | signal (e.g: buffer_switch)
201 channel_type_and_signal = value[0]
202 if channel_type_and_signal.find('|') >= 0:
203 channel_type = channel_type_and_signal[0:channel_type_and_signal.find("|")]
204 signal_type = channel_type_and_signal[channel_type_and_signal.find("|")+1:]
205 unhook(data)
206 add_hook(signal_type, data)
207 else:
208 channel_type = value[0]
209
210 value = value[1]
211
212 if channel_type == 'all' or weechat.buffer_get_string(bufpointer,'localvar_type') == channel_type:
213 return value
214 if channel_type == '!all':
215 a = ["channel","server","private"]
216 if weechat.buffer_get_string(bufpointer,'localvar_type') in a:
217 return value
218 return ""
219
220 # ================================[ main ]===============================
221 if __name__ == "__main__":
222 if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC,'',''):
223 weechat.hook_command(SCRIPT_NAME,SCRIPT_DESC,
224 '',
225 'How to use:\n'
226 '===========\n'
227 'Template:\n'
228 '/set plugins.var.python.text_item.<item_name> <type>|<signal> <${color:name/number}><text>\n\n'
229 ' type : channel, server, private, all (all kind of buffers e.g. /color, /fset...) and !all (channel, server and private buffer)\n'
230 ' (see: /buffer localvar)\n\n'
231 ' signal (eg.): buffer_switch, buffer_closing, print, mouse_enabled\n'
232 ' (for a list of all possible signals, see API doc weechat_hook_signal())\n'
233 '\n'
234 'You can activate a timer hook() to force an upgrade of all items in a given period of time, for example using an item that have to be\n'
235 'updated every second (e.g. watch)\n'
236 '\n'
237 'Examples:\n'
238 'creates an option for a text item named "nick_text". The item will be created for "channel" buffers. '
239 'The text displayed in the status-bar is "Nicks:" (yellow colored!):\n'
240 ' /set plugins.var.python.text_item.nick_text "channel ${color:yellow}Nicks:"\n\n'
241 'now you have to add the item "nick_text" to the bar.items (use auto-completion or iset.pl!)\n'
242 ' /set weechat.bar.status.items nick_text\n\n'
243 'creates an option to display the terminal width and height in an item bar. item will be updated on signal "signal_sigwinch":\n'
244 ' /set plugins.var.python.text_item.dimension "all|signal_sigwinch width: ${info:term_width} height: ${info:term_height}"\n'
245 'creates an option to display the status from "/filter toggle" and "/filter toggle @" command, item name is "filter_item":\n'
246 ' /set plugins.var.python.text_item.filter_item "!all|*filters* ${if:${info:filters_enabled}==1?${color:yellow}F:${color:243}F}${if:${buffer.filter}==1?${color:yellow}@:${color:243}@}"\n',
247 '',
248 '',
249 '')
250 version = weechat.info_get("version_number", "") or 0
251
252 for option, default_desc in settings.items():
253 if not weechat.config_is_set_plugin(option):
254 weechat.config_set_plugin(option, default_desc[0])
255 if int(version) >= 0x00030500:
256 weechat.config_set_desc_plugin(option, default_desc[1])
257
258 set_timer()
259 create_bar_items()
260
261 weechat.hook_config( 'plugins.var.python.' + SCRIPT_NAME + '.*', 'toggle_refresh_cb', '' )