d9ae20d5e829

weechat shit
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Thu, 19 Dec 2013 11:17:49 -0500
parents 17b2d28b8871
children f12b9fb52d75
branches/tags (none)
files weechat/perl/autoload/colorize_lines.pl weechat/plugins.conf weechat/weechat.conf

Changes

--- a/weechat/perl/autoload/colorize_lines.pl	Tue Dec 17 10:59:44 2013 -0500
+++ b/weechat/perl/autoload/colorize_lines.pl	Thu Dec 19 11:17:49 2013 -0500
@@ -1,5 +1,6 @@
 #
-# Copyright (c) 2010-2012 by Nils Görs <weechatter@arcor.de>
+# Copyright (c) 2010-2013 by Nils Görs <weechatter@arcor.de>
+# Copyleft (ɔ) 2013 by oakkitten
 #
 # colors the channel text with nick color and also highlight the whole line
 # colorize_nicks.py script will be supported
@@ -17,9 +18,37 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
-# for settings see help page
-#
+# with version 3.0 some options were renamed or have new possible values:
+# old:                  new:
+# avail_buffer          buffer
+# blacklist_channels    blacklist_buffers
+# highlight             new values
+
+# obsolete options:
+# buffer_autoset
+# hotlist_max_level_nicks_add
+# highlight_regex
+# highlight_words
+# shuffle
+# chat                  see option highlight
+
 # history:
+# 3.0: large part of script rewritten
+#      fix: works nicely with irc colors
+#      improved: highlight_regex and highlight_words work in a natural way
+#      removed: command /colorize_lines
+#      removed: option shuffle
+# 2.2: fix: regex with [tab] in message (patch by sqrrl)
+# 2.1: fix: changing highlight color did not apply messages already displayed (reported by rafi_)
+# 2.0: fix: debugging weechat::print() removed (thanks demure)
+# 1.9: fix: display bug with nick_mode
+# 1.8  add: option "use_irc_colors" (requested by Zertap)
+#      fix: empty char for nick_mode was used, even when "irc.look.nick_mode_empty" was OFF (reported by FlashCode)
+# 1.7: fix: broken lines in dcc chat (reported by equatorping)
+# 1.6: improved: wildcard "*" can be used for server and/or nick. (requested by ldvx)
+#    : add: new value, "only", for option "own_lines" (read help!)
+# 1.5: sync: option weechat.look.nickmode changed in 0.3.9 to "irc.look.nick_mode"
+# 1.4: fix: whole ctcp message was display in prefix (reported by : Mkaysi)
 # 1.3: fix: now using weechat::buffer_get_string() instead of regex to prevent problems with dots inside server-/channelnames (reported by surfhai)
 # 1.2: add: hook_modifier("colorize_lines") to use colorize_lines with another script.
 #    : fix: regex was too greedy and also hit tag "prefix_nick_ccc"
@@ -31,12 +60,12 @@
 #    : clean up code
 # 0.8.1: fix: regex()
 # 0.8: added: option "avail_buffer" and "nicks" (please read help-page) (suggested by ldvx)
-#    : fix: blacklist_channels wasn't load at start
+#    : fix: blacklist_buffers wasn't load at start
 #    : fix: nick_modes wasn't displayed since v0.7
 #    : rewrote init() routine
 #    : thanks to stfn for hint with unescaped variables in regex.
 # 0.7: fix: bug when irc.look.nick_suffix was set (reported and beta-testing by: hw2) (>= weechat 0.3.4)
-#      blacklist_channels option supports servername
+#      blacklist_buffers option supports servername
 #      clean up code
 # 0.6: code optimazations.
 #      rename of script (rainbow_text.pl -> colorize_lines.pl) (suggested by xt and flashcode)
@@ -55,528 +84,168 @@
 #
 # Development is currently hosted at
 # https://github.com/weechatter/weechat-scripts
-#
-# requirements: sunglasses ;-)
+
+# use Data::Dumper
+# $Data::Dumper::Useqq=1;
 
 use strict;
 my $prgname	= "colorize_lines";
-my $version	= "1.3";
-my $description	= "colors text in chat area with according nick color. Highlight messages will be fully highlighted in chat area";
+my $version	= "3.0";
+my $description	= "colors text in chat area with according nick color, including highlights";
 
-# default values
-my %default_options = ( "var_highlight"                         => "on",        # script options in weechat
-                        "var_avail_buffer"                      => "all",       # all, channel, query
-                        "var_chat"                              => "on",
-                        "var_shuffle"                           => "off",
-                        "var_buffer_autoset"                    => "off",
-                        "var_look_highlight"                    => "off",
-                        "var_look_highlight_regex"              => "off",
-                        "var_hotlist_max_level_nicks_add"	=> "off",
-                        "var_blacklist_channels"                => "",
-                        "var_nicks"                             => "",
-                        "var_own_lines"                         => "off",
+my %config = ("buffers"             => "all",       # all, channel, query
+              "blacklist_buffers"   => "",          # "a,b,c"
+              "lines"               => "on",
+              "highlight"           => "on",        # on, off, nicks
+              "nicks"               => "",          # "d,e,f", "/file"
+              "own_lines"           => "on",        # on, off, only
 );
 
-my %help_desc = ( "avail_buffer"         => "messages will be colored in buffer (all = all buffers, channel = channel buffers, query = query buffers (default: all ",
-                  "blacklist_channels"   => "comma separated list with channelname. Channels in this list will be ignored. (e.g.: freenode.#weechat,freenode.#weechat-fr)",
-                  "shuffle"              => "toggle shuffle color mode for chats area (default: off)",
-                  "chat"                 => "colors text in chat area with according nick color (default: on)",
-                  "highlight"            => "highlight messages will be fully highlighted in chat area (on = whole line will be highlighted, off = only nick will be highlighted, always = a highlight will always color the whole message) (default: on)",
-                  "hotlist_max_level_nicks_add"         => "toggle highlight for hotlist (default: off)",
-                  "buffer_autoset"       => "toggle highlight color in chat area for buffer_autoset (default: off)",
-                  "look_highlight"       => "toggle highlight color in chat area for option weechat.look.highlight (default: off)",
-                  "look_highlight_regex" => "toggle highlight color in chat area for option weechat.look.highlight_regex (default: off)",
-                  "nicks"                => "comma separated list with nicknames. Only messages from nicks in this list will be colorized. (e.g.: freenode.nils_2,freenode.flashcode,freenode.weebot). You can also give a filename with nicks. The filename has to start with \"/\" (e.g.: /buddylist.txt). The format has to be: one nick each line with <servername>.<nickname>",
-                  "own_lines"            => "colors own written messages (default: off)",
+my %help_desc = ("buffers"             => "buffer type affected by the script (all/channel/query, default: all)",
+                 "blacklist_buffers"   => "comma-separated list of channels to be ignored (e.g. freenode.#weechat,*.#python)",
+                 "lines"               => "apply nickname color to the non-highlighted lines (off/on/nicks). the latter will limit highlighting to nicknames in option 'nicks'",
+                 "highlight"           => "apply highlight color to the highlighted lines (off/on/nicks). the latter will limit highlighting to nicknames in option 'nicks'",
+                 "nicks"               => "comma-separater list of nicks (e.g. freenode.cat,*.dog) OR file name starting with '/' (e.g. /file.txt). in the latter case, nicknames will get loaded from that file inside weechat folder (e.g. from ~/.weechat/file.txt). nicknames in file are newline-separated (e.g. freenode.dog\\n*.cat)",
+                 "own_lines"           => "apply nickname color to own lines (off/on/only). the latter turns off all other kinds of coloring altogether",
 );
 
-my $zahl = 0;
-my $weechat_version = 0;
-my $nick_mode = "";
-my $get_prefix_action = "";
-my @var_blacklist_channels = "";
-my @nick_list = "";
-
-# standard colours.
-my %colours = ( 0 => "darkgray", 1 => "red", 2 => "lightred", 3 => "green",
-                4 => "lightgreen", 5 => "brown", 6 => "yellow", 7 => "blue",
-                8 => "lightblue", 9 => "magenta", 10 => "lightmagenta", 11 => "cyan",
-                12 => "lightcyan", 13 => "white");
+#################################################################################################### config
 
 # program starts here
 sub colorize_cb {
-my ( $data, $modifier, $modifier_data, $string ) = @_;
-
-if (index($modifier_data,"irc_privmsg") == -1){                                                 # its neither a channel nor a query buffer
-  return $string;
-}
-
-if ($default_options{var_highlight} eq "off" and $default_options{var_chat} eq "off"){          # all options OFF
-  return $string;
-}
-
-# get servername and channelname. Do not use regex to extract server- and channelname out of $modifier_data. You will FAIL!
-# some possible names: freenode.#weechat, freenode.#weechat.de, freenode.query, chat.freenode.net.#weechat, chat.freenode.net.#weechat.de
-$modifier_data =~ (m/(.*);(.*);/);
-my $plugin = $1;
-my $name = $2;
-my $buf_pointer = weechat::buffer_search($plugin,$name);
-return $string if ($buf_pointer eq "");
-my $servername = weechat::buffer_get_string($buf_pointer, "localvar_server");
-my $channel_name = weechat::buffer_get_string($buf_pointer, "localvar_channel");
-
-my $my_nick = weechat::info_get( 'irc_nick', $servername );                                     # get nick with servername (;freenode.)
-
-if ( grep /^$servername.$channel_name$/, @var_blacklist_channels ) {                            # check for blacklist_channels
-  return $string;
-}
-
-$string =~ m/^(.*)\t(.*)/;                                                                      # get the nick name: nick[tab]string
-my $nick = $1;                                                                                  # nick with nick_mode and color codes
-my $line = $2;                                                                                  # get written text
-
-$line = weechat::string_remove_color($line,"");                                                 # remove color-codes from line, first
-# get the nick name from modifier_data (without nick_mode and color codes! Take care of tag "prefix_nick_ccc")
-$modifier_data =~ m/(^|,)nick_(.*),/;
-my $nick_wo_suffix = $2;                                                                        # nickname without nick_suffix
-
-if ( lc($nick_wo_suffix) eq lc($my_nick) ){                                                     # this one checks for own messages
-  if ( $default_options{var_avail_buffer} ne "all" ){                                           # check for option avail_buffer
-    if ( substr($channel_name, 0, 1) eq "#" ){                                                  # get first chat of buffer.
-      return $string if ( $default_options{var_avail_buffer} ne "channel" );                    # channel? yes
-    }else{                                                                                      # query buffer?
-      return $string if ( $default_options{var_avail_buffer} ne "query" );                      # yes
-    }
-  }
-}
+    my ( $data, $modifier, $modifier_data, $string ) = @_;
 
-# recreate irc.look.nick_suffix and irc.color.nick_suffix
-my $nick_suffix_with_color = "";
-my $nick_suffix = weechat::config_string( weechat::config_get("irc.look.nick_suffix"));
-if ( $nick_suffix ne "" ){
-  my $nick_suffix_color = weechat::color( weechat::config_color( weechat::config_get( "irc.color.nick_suffix" )));
-  $nick_suffix_with_color = $nick_suffix_color . $nick_suffix;
-}
-# recreate irc.look.nick_prefix and irc.color.nick_prefix
-my $nick_prefix_with_color = "";
-my $nick_prefix = weechat::config_string( weechat::config_get("irc.look.nick_prefix"));
-if ( $nick_prefix ne "" ){
-  my $nick_prefix_color = weechat::color( weechat::config_color( weechat::config_get( "irc.color.nick_prefix" )));
-  $nick_prefix_with_color = $nick_prefix_color . $nick_prefix;
-}
-
-# check for action (/me)
-my $prefix_action_with_color = "";
-if (index($modifier_data,"irc_action") >= 0){
-  my $prefix_action_color = weechat::color( weechat::config_color( weechat::config_get( "weechat.color.chat_prefix_action" )));
-  my $prefix_action = weechat::config_string( weechat::config_get("weechat.look.prefix_action"));
-  $prefix_action_with_color = $prefix_action_color . $prefix_action;
-}
-
-# check if look.nickmode is ON and no prefix and no query buffer
-$nick_mode = "";
-if ( weechat::config_boolean(weechat::config_get("weechat.look.nickmode")) ==  1 and ($nick ne $get_prefix_action) and (index($modifier_data,"notify_private")) == -1){
-#   if ($nick  =~ m/^\@|^\%|^\+|^\~|^\*|^\&|^\!|^\-/) {                                                  # check for nick modes (@%+~*&!-) without colour
-      my $nick_pointer = weechat::nicklist_search_nick($buf_pointer,"",$nick_wo_suffix);
-      $nick_mode = weechat::nicklist_nick_get_string($buf_pointer,$nick_pointer,"prefix");
-      my $color_mode = weechat::color( weechat::nicklist_nick_get_string($buf_pointer, $nick_pointer, "prefix_color") );
-      if ( $nick_mode eq "" or $color_mode eq ""){                                             # no nick_mode!
-        $nick_mode = "";
-      }else{                                                                                    # nick_mode exists
-        $nick_mode = $color_mode . $nick_mode;
-      }
-}
-
-# i wrote the message
-#weechat::print("","nick_wo: $nick_wo_suffix");
-#weechat::print("","my_nick: $my_nick");
-    if ($nick_wo_suffix eq $my_nick ){                                                                  # i wrote the message
-      return $string if check_whitelist_nicks($servername, $my_nick, $nick_wo_suffix);                  # check for whitelist
-      if ($default_options{var_chat} eq "on"){
-	  my $nick_color = weechat::config_color(weechat::config_get("weechat.color.chat_nick_self"));  # get my nick color
-	  $nick_color = weechat::color($nick_color);
-	  $line = colorize_nicks($nick_color,$modifier_data,$line);
-
-          if (index($modifier_data,"irc_action") >= 0){                                                 # /me message?
-            $nick = $prefix_action_with_color;
-            $nick_mode = "";                                                                            # clear nick_mode for /me
-          }else{
-            $nick = $nick_prefix_with_color . $nick_color . $nick_wo_suffix . $nick_suffix_with_color;
-          }
-	  $line = $nick_mode . $nick_color . $nick . "\t" . $nick_color . $line . weechat::color('reset');
-	  return $line;
-      }else{
-	  return $string;
-      }
+    # quit if it's not a privmsg or ctcp
+    # or we are not supposed to
+    if ((index($modifier_data,"irc_privmsg") == -1) ||
+        (index($modifier_data,"irc_ctcp") >= 0)) {
+        return $string;
     }
 
-
-# get nick color
-$nick = $nick_wo_suffix;
-#$nick = weechat::string_remove_color($nick_wo_suffix,"");                                      # remove colour-codes from nick
-my $nick_color = weechat::info_get('irc_nick_color', $nick_wo_suffix);                          # get nick-colour
-
-    my $var_hl_max_level_nicks_add = 0;
-# highlight message received?
-    if ( $default_options{var_highlight} eq "on" or $default_options{var_highlight} eq "always" ){# highlight_mode on?
-# this one check for other nick!!
-
-      unless ( $default_options{var_highlight} eq "always" ){                                   # option is not "always"
-        return $string if check_whitelist_nicks($servername, $my_nick, $nick_wo_suffix);        # check for whitelist
-      }
-
-      if ( $default_options{var_buffer_autoset} eq "on" || $default_options{var_look_highlight} eq "on" ){# buffer_autoset or look_highlight "on"?
-	  my $highlight_words = "";
+    # find buffer pointer
+    $modifier_data =~ m/([^;]*);([^;]*);/;
+    my $buffer = weechat::buffer_search($1, $2);
+    return $string if ($buffer eq "");
 
-	  # get strings from buffer_autoset and/or weechat.look.highlight and weechat.look.highlight_regex
-	  if ($default_options{var_buffer_autoset} eq "on"){
-	    my $highlight_words_add = weechat::config_string(weechat::config_get("buffer_autoset.buffer.irc.".$servername.".".$channel_name.".highlight_words_add"));
-	    $highlight_words .= $highlight_words_add . ",";
-	  }
-
-	  if ($default_options{var_look_highlight} eq "on"){
-	    my $look_highlight = weechat::config_string( weechat::config_get("weechat.look.highlight") );
-	    $highlight_words .= $look_highlight;
-	  }
-	  if ( $default_options{var_hotlist_max_level_nicks_add} eq "on" and weechat::config_string(weechat::config_get("buffer_autoset.buffer.irc.".$servername.".".$channel_name.".hotlist_max_level_nicks_add")) =~ /$nick\:[0-2]/ ){
-	    $var_hl_max_level_nicks_add = 1;
-	  }
-
-            $/ = ",";                                                                           # kill "," at end of string
-
-	    chomp($highlight_words);
-
-#            weechat::print("",$highlight_words);
-	      foreach ( split( /,+/, $highlight_words ) ) {                                     # check for highlight_words
-		  if ($_ eq ""){next;}                                                          # ignore empty string
-		    my $search_string = shell2regex($_);
+    # find buffer name, server name
+    # return if buffer is in a blacklist
+    my $buffername = weechat::buffer_get_string($buffer, "name");
+    return $string if weechat::string_has_highlight($buffername, $config{blacklist_buffers});
+    my $servername = weechat::buffer_get_string($buffer, "localvar_server");
 
-		  if ($string =~ m/\b$search_string\b/gi){                                      # i (ignorecase)
-		    my $color_highlight = weechat::config_color(weechat::config_get("weechat.color.chat_highlight"));
-		    my $color_highlight_bg = weechat::config_color(weechat::config_get("weechat.color.chat_highlight_bg"));
-		    my $high_color = weechat::color("$color_highlight,$color_highlight_bg");
-                          if (index($modifier_data,"irc_action") >= 0){
-			    $line = colorize_nicks($high_color,$modifier_data,$line);
-                            $nick = $prefix_action_with_color;
-			    $line = $high_color . $nick . "\t" . $high_color . $line . weechat::color('reset');
-			    return $line;
-			  }
-		    $line = colorize_nicks($high_color,$modifier_data,$line);
-		    $line = $nick_mode . $high_color . $nick_prefix_with_color . $nick . $nick_suffix_with_color . "\t" . $high_color . $line . weechat::color('reset');
-		    return $line;
-		  }
-	      }
-      }
-	# buffer_autoset is off.
-        if ( weechat::string_has_highlight($line, $my_nick) >= 1){
-#        if (lc($string) =~ m/(\w.*$my_nick.*)/){                                                # my name called in string (case insensitiv)?
-	    my $color_highlight = weechat::config_color(weechat::config_get("weechat.color.chat_highlight"));
-	    my $color_highlight_bg = weechat::config_color(weechat::config_get("weechat.color.chat_highlight_bg"));
-
-	    my $high_color = weechat::color("$color_highlight,$color_highlight_bg");
+    # find stuff between \t
+    $string =~ m/^([^\t]*)\t(.*)/;
+    my $left = $1;
+    my $right = $2;
 
-              if (index($modifier_data,"irc_action") >= 0){                                    # action used (/me)?
-                $line = colorize_nicks($high_color,$modifier_data,$line);
-                $nick = $prefix_action_with_color;
-                $line = $high_color . $nick . "\t" . $high_color . $line . weechat::color('reset');
-                return $line;
-	      }
+    # find nick of the sender
+    # find out if we are doing an action
+    my $nick = ($modifier_data =~ m/(^|,)nick_([^,]*)/) ? $2 : weechat::string_remove_color($left, "");
+    my $action = ($modifier_data =~ m/\birc_action\b/) ? 1 : 0;
 
-# highlight whole line
-	if ( $var_hl_max_level_nicks_add eq 0 ){
-	      $line = colorize_nicks($high_color,$modifier_data,$line);
-	      $line = $nick_prefix_with_color . $nick_mode . $high_color . $nick . $nick_suffix_with_color . "\t" . $high_color . $line . weechat::color('reset');
-	      return $line;
-	}
-	}
-    } # highlight area finished
-
-return $string if check_whitelist_nicks($servername, $my_nick, $nick_wo_suffix);                # check for whitelist
-# this one check for other nick!!
-if ( $default_options{var_avail_buffer} ne "all" ){                                             # check for option avail_buffer
-  if ( index($modifier_data,"notify_message") > -1){                                            # message is public
-    return $string if ( $default_options{var_avail_buffer} ne "channel" );
-  }elsif ( index($modifier_data,"notify_private") > -1){                                        # message is privat
-    return $string if ( $default_options{var_avail_buffer} ne "query" );
-  }
-}
+    ######################################## get color
 
-# simple channel message
-    if ($default_options{var_chat} eq "on"){                                                    # chat_mode on?
-	if ($default_options{var_shuffle} eq "on"){                                             # color_shuffle on?
-	  my $zahl2 = 0;
-	  my $my_color = weechat::config_color(weechat::config_get("weechat.color.chat_nick_self"));# get my own nick colour
-	    for (1){                                                                            # get a random colour but don't use
-	      redo if ( $zahl ==  ($zahl2 = int(rand(14))) or ($colours{$zahl2} eq $my_color) );# latest color nor own nick color
-	      $zahl = $zahl2;
-	    }
-	  $nick_color = weechat::color($colours{$zahl});                                        # get new random color
-	}
-
-# check for weechat version and use weechat.look.highlight_regex option
-       if ( $weechat_version eq 1 ){                                                            # weechat is >= 0.3.4?
-	  if ( $default_options{var_look_highlight_regex} eq "on" ){
-	    if ( weechat::string_has_highlight_regex($line,weechat::config_string(weechat::config_get("weechat.look.highlight_regex"))) eq 1 ){
-		my $color_highlight = weechat::config_color(weechat::config_get("weechat.color.chat_highlight"));
-		my $color_highlight_bg = weechat::config_color(weechat::config_get("weechat.color.chat_highlight_bg"));
-
-		my $high_color = weechat::color("$color_highlight,$color_highlight_bg");
-		$line = colorize_nicks($high_color,$modifier_data,$line);
-		$line = $nick_prefix_with_color . $nick_mode . $high_color . $nick . $nick_suffix_with_color . "\t" . $high_color . $line . weechat::color('reset');
-		return $line;
-	    }
-	  }
-	}
-          if (index($modifier_data,"irc_action") >= 0){
-#	  if ($default_options{prefix_action} eq $nick){
-                my $nick_color = weechat::info_get('irc_nick_color', $nick_wo_suffix);          # get nick-color
-		$line = colorize_nicks($nick_color,$modifier_data,$line);
-                $nick = $prefix_action_with_color;
-		$line = $nick . "\t" . $nick_color . $line . weechat::color('reset');
-		return $line;
-	  }
-
-      $line = colorize_nicks($nick_color,$modifier_data,$line);
-      $line = $nick_prefix_with_color . $nick_mode . $nick_color . $nick . $nick_suffix_with_color .  "\t" . $nick_color . $line . weechat::color('reset');  # create new line nick_color+nick+separator+text
-      return $line;
-    }else{
-      return $string;										# return original string
-    }
-} # end of sub colorize_cb{}
-
-# whitelist nicks
-sub check_whitelist_nicks{
-my ( $servername, $my_nick, $nick_wo_suffix ) = @_;
-  if ( $default_options{var_nicks} ne "" and $default_options{var_own_lines} eq "off" ){          # nicks in option and own_lines = off
-        return 1 unless (grep /^\Q$servername.$nick_wo_suffix\E$/i, @nick_list)                   # check other nicks
-  }elsif ( $default_options{var_nicks} ne "" and $default_options{var_own_lines} eq "on" ){       # nicks in option and own_lines = on
-      if ( $nick_wo_suffix ne $my_nick){                                                          # not my nick!
-        return 1 unless (grep /^\Q$servername.$nick_wo_suffix\E$/i, @nick_list)                   # check other nicks
-      }
-  }elsif( $default_options{var_nicks} eq "" and $default_options{var_own_lines} eq "off" ){       # no nicks and do not color my line?
-      if ( $nick_wo_suffix eq $my_nick){                                                          # my nick?
-        return 1;                                                                                 # yes
-      }
-  }
-return 0;
-}
-
-# converts shell wildcard characters to regex
-sub shell2regex {
-    my $globstr = shift;
-    my %patmap = (
-        '*' => '.*',
-        '?' => '.',
-        '[' => '[',
-        ']' => ']',
-    );
-    $globstr =~ s{(.)} { $patmap{$1} || "\Q$1" }ge;
-    return $globstr;
-}
-
-# check for colorize_nicks script an set colour before and after nick name 
-sub colorize_nicks{
-my ( $nick_color, $mf_data, $line ) = @_;
-
-my $pyth_ptn = weechat::infolist_get("python_script","","colorize_nicks");
-weechat::infolist_next($pyth_ptn);
-
-if ( "colorize_nicks" eq weechat::infolist_string($pyth_ptn,"name") ){				# does colorize_nicks is installed?
-	$line = weechat::hook_modifier_exec( "colorize_nicks",$mf_data,$line);			# call colorize_nicks function and color the nick(s)
-	my @array = "";
-	my $color_code_reset = weechat::color('reset');
-	@array=split(/$color_code_reset/,$line);
-	my $new_line = "";
-	foreach (@array){
-	  $new_line .=  $nick_color . $_ . weechat::color('reset');
-	}
-	$new_line =~ s/\s+$//g;									# remove space at end
-	$line = $new_line;
-}
-weechat::infolist_free($pyth_ptn);
-
-return $line;
-}
-
-# -----------------------------[ config ]-----------------------------------
-sub init_config{
-    foreach my $option ( keys %default_options ){
-        $option = substr($option,4,length($option)-4);
-        if (!weechat::config_is_set_plugin($option)){
-            weechat::config_set_plugin($option, $default_options{"var_" . $option});
-        }else{
-            $default_options{"var_" . $option} = lc( weechat::config_get_plugin($option) );
+    my $color = "";
+    my $my_nick = weechat::buffer_get_string($buffer, "localvar_nick");
+    if ($my_nick eq $nick) {
+        # it's our own line
+        # process only if own_lines is "on" or "only" (i.e. not "off")
+        return $string if ($config{own_lines} eq "off");
+        $color = weechat::color("chat_nick_self");
+    } else {
+        # it's someone else's line
+        # don't process is own_lines are "only"
+        # in order to get correct matching, remove colors from the string
+        return $string if ($config{own_lines} eq "only");
+        my $right_nocolor = weechat::string_remove_color($right, "");
+        if (weechat::string_has_highlight($right_nocolor, weechat::buffer_string_replace_local_var($buffer, weechat::buffer_get_string($buffer, "highlight_words"))) ||
+            weechat::string_has_highlight($right_nocolor, weechat::config_string(weechat::config_get("weechat.look.highlight"))) ||
+            weechat::string_has_highlight_regex($right_nocolor, weechat::config_string(weechat::config_get("weechat.look.highlight_regex"))) ||
+            weechat::string_has_highlight_regex($right_nocolor, weechat::buffer_get_string($buffer, "highlight_regex"))
+           ) {
+            # we have a hilight! get a hilight color
+            # and replace the first occurance of coloring, that'd be nick color
+            # process only if highlight is "on" OR "nicks" & nick's in nicks
+            return $string if ($config{highlight} eq "off" ||
+                ($config{highlight} eq "nicks" && !weechat::string_has_highlight("$servername.$nick", $config{nicks})));
+            $color = weechat::color('chat_highlight');
+            $right =~ s/\31[^\31 ]+?\Q$nick/$color$nick/ if ($action);
+        } else {
+            # that's not a highlight
+            # process only if lines is "on" OR "nicks" & nick's in nicks
+            return $string if ($config{lines} eq "off" ||
+                ($config{lines} eq "nicks" && !weechat::string_has_highlight("$servername.$nick", $config{nicks})));
+            $color = weechat::info_get('irc_nick_color', $nick);
         }
     }
 
-    if ( ($weechat_version ne "") && (weechat::info_get("version_number", "") >= 0x00030500) ) {    # v0.3.5
-        description_options();
-    }
+    ######################################## inject colors and go!
 
-    if ( $default_options{"var_blacklist_channels"} ne "" ){
-        @var_blacklist_channels = "";
-        @var_blacklist_channels = split( /,/, $default_options{"var_blacklist_channels"} );
-    }
-    if ( $default_options{var_nicks} ne "" ){
-      undef (@nick_list);
-      if ( substr($default_options{var_nicks}, 0, 1) eq "/" ){                                # get first chat of nicks "/" ?
-          nicklist_read();                                                                      # read nicks from file
-      }else{
-          @nick_list = split( /,/, $default_options{var_nicks} );                             # use nicks from option
-      }
-    }
-
-}
-
-sub toggle_config_by_set{
-my ( $pointer, $name, $value ) = @_;
-    $name = substr($name,length("plugins.var.perl.$prgname."),length($name));
-    $default_options{"var_" . $name} = lc($value);
-
-    if ( $name eq "blacklist_channels" ){
-      @var_blacklist_channels = "";
-      @var_blacklist_channels = split( /,/, $default_options{"var_" . $name} );
+    my $out = "";
+    if ($action) {
+        # remove the first color reset - after * nick
+        # make other resets reset to our color
+        $right =~ s/\34//;
+        $right =~ s/\34/\34$color/g;
+        $out = $left . "\t" . $right . "\34"
+    } else {
+        # make other resets reset to our color
+        $right =~ s/\34/\34$color/g;
+        $out = $left . "\t" . $color . $right . "\34"
     }
-    if ( $name eq "nicks" ){
-      undef (@nick_list);
-      if ( $default_options{"var_".$name} eq "" ){                                              # no nicks given
-          undef (@nick_list);
-#          count_nicks();
-      }elsif ( substr($default_options{var_nicks}, 0, 1) eq "/" ){                             # get first chat of nicks "/" ?
-          nicklist_read();                                                                      # read nicks from file
-#          count_nicks();
-      }else{
-          @nick_list = split( /,/, $default_options{"var_" . $name} );
-#          count_nicks();
-      }
-    }
-
-$default_options{var_avail_buffer} = "all" if ( $default_options{var_avail_buffer} eq "" );
-
-return weechat::WEECHAT_RC_OK ;
-}
-
-# create description options for script...
-sub description_options{
-    foreach my $option ( keys %help_desc ){
-        weechat::config_set_desc_plugin( $option,$help_desc{$option} );
-    }
-}
-
-# toggle functions on/off with command line
-sub change_settings{
-my $getarg = lc($_[2]); # switch to lower-case
-
-    foreach my $option ( keys %default_options ){
-      $option = substr($option,4,length($option)-4);            # remove "var_" from option
-      if ( $getarg eq $option ){
-        if ( $default_options{"var_" . $option} eq "on" ){
-          weechat::config_set_plugin( $option, "off" );
-        }else{
-          weechat::config_set_plugin( $option, "on" );
-        }
-      }
-    }
-return weechat::WEECHAT_RC_OK;
+    #weechat::print("", ""); weechat::print("", "\$str " . Dumper($string)); weechat::print("", "\$out " . Dumper($out));
+    return $out;
 }
 
+#################################################################################################### config
+
+# read nicknames if $conf{nisks} starts with /
+# after this, $conf{nisks} is of form a,b,c,d
+# if it doesnt start with /, assume it's already a,b,c,d
 sub nicklist_read {
-        undef (@nick_list);
-        my $weechat_dir = weechat::info_get( "weechat_dir", "" );
-        my $nicklist = weechat::config_get_plugin("nicks");
-        $nicklist = $weechat_dir.$nicklist;
-        $default_options{var_nicks} = "" unless -e $nicklist;
-        return unless -e $nicklist;
-        open (WL, "<", $nicklist) || DEBUG("$nicklist: $!");
-        while (<WL>) {
-                chomp;                                                          # kill LF
-                        my ( $servername, $nickname ) = split /\./;           # servername,nickname (seperator could be "," or ".")
-                        if (not defined $nickname){
-                                close WL;
-                                weechat::print("",weechat::prefix("error")."$prgname: $nicklist is not valid format (<servername>.<nickname>).");
-                                return;
-                        }
-              push @nick_list,($servername.".".$nickname."," );                 # servername.nickname+","
-        }
-        close WL;
-        chop @nick_list;                                                        # remove last ","
+    return if (substr($config{nicks}, 0, 1) ne "/");
+    my $file = weechat::info_get("weechat_dir", "") . $config{nicks};
+    return unless -e $file;
+    my $nili = "";
+    open (WL, "<", $file) || DEBUG("$file: $!");
+    while (<WL>) {
+        chomp;                                                         # kill LF
+        $nili .= $_ . ",";
+    }
+    close WL;
+    chop $nili;                                                        # remove last ","
+    $config{nicks} = $nili;
 }
 
-# debug....
-sub count_nicks{
-  my $anzahl=@nick_list;
-  weechat::print("","anzahl: $anzahl");
-
-  foreach (@nick_list){
-      weechat::print ("","$_");
-  }
+# called when a config option ha been changed
+# $name = plugins.var.perl.$prgname.nicks etc
+sub toggle_config_by_set {
+    my ($pointer, $name, $value) = @_;
+    $name = substr($name,length("plugins.var.perl.$prgname."),length($name));
+    $config{$name} = lc($value);
+    nicklist_read() if ($name eq "nicks");
 }
-# -------------------------------[ init ]-------------------------------------
-# first function called by a WeeChat-script.
-weechat::register($prgname, "Nils Görs <weechatter\@arcor.de>", $version,
-                  "GPL3", $description, "", "");
-# check weechat version
-  $weechat_version = weechat::info_get("version_number", "");
-  if (( $weechat_version eq "" ) or ( $weechat_version < 0x00030400 )){
-    weechat::print("",weechat::prefix("error")."$prgname: needs WeeChat >= 0.3.4. Please upgrade: http://www.weechat.org/");
-    weechat::command("","/wait 1ms /perl unload $prgname");
-  }
 
-
-init_config();
-
-
-$get_prefix_action = weechat::config_string(weechat::config_get("weechat.look.prefix_action"));
-weechat::hook_modifier("weechat_print","colorize_cb", "");
-weechat::hook_modifier("colorize_lines","colorize_cb", "");
-
-  if (( $weechat_version ne "" ) && ( $weechat_version >= 0x00030400 )){        # v0.3.4?
-    $weechat_version = 1;                                                       # yes!
-
-    # read nick colours if exists (>= weechat 0.3.4) in %colours
-    my $colours_buf = weechat::config_string(weechat::config_get("weechat.color.chat_nick_colors"));
-    if ( $colours_buf ne "" ) {
-        my @array = split(/,/,$colours_buf);
-        my $i = 0;
-        foreach (@array){
-          $colours{$i++} = $_;
+# read configuration from weechat OR
+#   set default options and
+#   set dectription if weechat >= 0.3.5
+# after done, read nicklist from file if needed
+sub init_config {
+    my $weechat_version = weechat::info_get('version_number', '') || 0;
+    foreach my $option (keys %config){
+        if (!weechat::config_is_set_plugin($option)) {
+            weechat::config_set_plugin($option, $config{$option});
+            weechat::config_set_desc_plugin($option, $help_desc{$option}) if ($weechat_version >= 0x00030500); # v0.3.5
+        } else {
+            $config{$option} = lc(weechat::config_get_plugin($option));
         }
-      undef $colours_buf;
-      undef @array;
     }
-  }
-
-weechat::hook_command($prgname, $description,
-
-        "<highlight> || <chat> || <shuffle> || <autoset> || <look_highlight> || <look_highlight_regex> || <hotlist> || <own_lines>",
+    nicklist_read();
+}
 
-        "<highlight>            toggle highlight color in chat area (on/off)\n".
-        "<chat>                 colors the text in chat area with according nick color (on/off)\n".
-        "<shuffle>              toggle shuffle color mode on/off\n".
-        "<autoset>              toggle highlight color mode for buffer_autoset on/off\n".
-        "<look_highlight>       toggle highlight color mode for weechat.look.highlight on/off\n".
-        "<look_highlight_regex> toggle highlight color in chat area for option weechat.look.highlight_regex on/off\n".
-        "<hotlist>              toggle hotlist_max_level_nicks_add on/off\n".
-        "<own_lines>            toggle coloring of own lines on/off\n".
-        "\n".
-        "Options (script):\n".
-        "   'plugins.var.perl.$prgname.highlight'                   : $help_desc{highlight}\n".
-        "   'plugins.var.perl.$prgname.hotlist_max_level_nicks_add' : $help_desc{hotlist_max_level_nicks_add}\n".
-        "   'plugins.var.perl.$prgname.buffer_autoset'              : $help_desc{buffer_autoset}\n".
-        "   'plugins.var.perl.$prgname.look_highlight'              : $help_desc{look_highlight}\n".
-        "   'plugins.var.perl.$prgname.look_highlight_regex'        : $help_desc{look_highlight_regex}\n".
-        "   'plugins.var.perl.$prgname.chat'                        : $help_desc{chat}\n".
-        "   'plugins.var.perl.$prgname.shuffle'                     : $help_desc{shuffle}\n".
-        "   'plugins.var.perl.$prgname.blacklist_channels'          : $help_desc{blacklist_channels}\n".
-        "   'plugins.var.perl.$prgname.avail_buffer'                : $help_desc{avail_buffer}\n".
-        "   'plugins.var.perl.$prgname.nicks'                       : $help_desc{nicks}\n".
-        "   'plugins.var.perl.$prgname.own_lines'                   : $help_desc{own_lines}\n".
-        "\n".
-        "Options (global):\n".
-        "   'weechat.color.chat_highlight'                      : highlight color\n".
-        "   'weechat.color.chat_highlight_bg'                   : highlight background color\n".
-        "   'weechat.color.chat_nick*'                          : colors for nicks\n\n".
-        "To use options \"buffer_autoset\" and/or \"hotlist_max_level_nicks_add\" install buffer_autoset script from: http://www.weechat.org/scripts/\n",
-        "highlight|chat|shuffle|autoset|look_highlight|look_highlight_regex|hotlist|own_lines %-", "change_settings", "");
+#################################################################################################### start
 
-weechat::hook_config( "plugins.var.perl.$prgname.*", "toggle_config_by_set", "" );
+weechat::register($prgname, "Nils Görs <weechatter\@arcor.de>", $version, "GPL3", $description, "", "");
+weechat::hook_modifier("500|weechat_print","colorize_cb", "");
+init_config();
+weechat::hook_config("plugins.var.perl.$prgname.*", "toggle_config_by_set", "");
--- a/weechat/plugins.conf	Tue Dec 17 10:59:44 2013 -0500
+++ b/weechat/plugins.conf	Thu Dec 19 11:17:49 2013 -0500
@@ -29,11 +29,14 @@
 perl.buffers.sort = "number"
 perl.check_license = "on"
 perl.colorize_lines.avail_buffer = "all"
+perl.colorize_lines.blacklist_buffers = ""
 perl.colorize_lines.blacklist_channels = ""
 perl.colorize_lines.buffer_autoset = "off"
+perl.colorize_lines.buffers = "all"
 perl.colorize_lines.chat = "off"
 perl.colorize_lines.highlight = "on"
 perl.colorize_lines.hotlist_max_level_nicks_add = "off"
+perl.colorize_lines.lines = "off"
 perl.colorize_lines.look_highlight = "on"
 perl.colorize_lines.look_highlight_regex = "on"
 perl.colorize_lines.nicks = ""
@@ -61,8 +64,10 @@
 
 [desc]
 perl.colorize_lines.avail_buffer = "messages will be colored in buffer (all = all buffers, channel = channel buffers, query = query buffers (default: all "
+perl.colorize_lines.blacklist_buffers = "comma-separated list of channels to be ignored (e.g. freenode.#weechat,*.#python)"
 perl.colorize_lines.blacklist_channels = "comma separated list with channelname. Channels in this list will be ignored. (e.g.: freenode.#weechat,freenode.#weechat-fr)"
 perl.colorize_lines.buffer_autoset = "toggle highlight color in chat area for buffer_autoset (default: off)"
+perl.colorize_lines.buffers = "buffer type affected by the script (all/channel/query, default: all)"
 perl.colorize_lines.chat = "colors text in chat area with according nick color (default: on)"
 perl.colorize_lines.highlight = "highlight messages will be fully highlighted in chat area (on = whole line will be highlighted, off = only nick will be highlighted, always = a highlight will always color the whole message) (default: on)"
 perl.colorize_lines.hotlist_max_level_nicks_add = "toggle highlight for hotlist (default: off)"
--- a/weechat/weechat.conf	Tue Dec 17 10:59:44 2013 -0500
+++ b/weechat/weechat.conf	Thu Dec 19 11:17:49 2013 -0500
@@ -34,8 +34,8 @@
 day_change = on
 day_change_time_format = "%a, %d %b %Y"
 eat_newline_glitch = off
-highlight = "sjl"
-highlight_regex = "(sjl|^all[,:]|backend(ia)?[^/]|slosh|slj|clojerks|red[- ]tape|c2c|arroway|[mM]oney ?[dD]rop)"
+highlight = "sjl,slosh,slj,clojerks,c2c,arroway"
+highlight_regex = "(^all[,:]|backend(ia)?[^/]|red[- ]tape|[mM]oney ?[dD]rop)"
 highlight_tags = ""
 hotlist_add_buffer_if_away = on
 hotlist_buffer_separator = ", "