home · contact · privacy
Adapt indent, highlight nicknames in chat windows, add line formattings test. master
authorChristian Heller <c.heller@plomlompom.de>
Mon, 27 Oct 2025 06:40:14 +0000 (07:40 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 27 Oct 2025 06:40:14 +0000 (07:40 +0100)
src/ircplom/client_tui.py
src/ircplom/tui_base.py
src/tests/pingpong.test
src/tests/test.test
src/tests/tui_draw.test
src/tests/tui_line_formattings.test [new file with mode: 0644]

index fd5e8aabc2226d91cfd196675713a4f0fa3e423c..92806d5f5d87e9a22d47471bf1eea701e0c9752e 100644 (file)
@@ -359,8 +359,10 @@ class _TuiClientDb(_UpdatingNode, SharedClientDbFields):
             is_server_msg = not (update.value.sender or update.value.target)
             brackets = '()' if update.value.is_notice else '[]'
             toks = [f':{brackets[0]}']
             is_server_msg = not (update.value.sender or update.value.target)
             brackets = '()' if update.value.is_notice else '[]'
             toks = [f':{brackets[0]}']
+            toks += ['RAW:{bold|']
             toks += [f':{update.value.sender}' if update.value.sender
                      else (':server' if is_server_msg else 'NICK:me')]
             toks += [f':{update.value.sender}' if update.value.sender
                      else (':server' if is_server_msg else 'NICK:me')]
+            toks += ['RAW:}']
             toks += [f':{brackets[1]} {update.value.content}']
             update.results += [
                 (_LogScope.SERVER if is_server_msg else _LogScope.CHAT, toks)]
             toks += [f':{brackets[1]} {update.value.content}']
             update.results += [
                 (_LogScope.SERVER if is_server_msg else _LogScope.CHAT, toks)]
index 682858077f134925eebb92a1440d6505b36f26c3..2aecdec3086cbc85932d2b3124745269137b717c 100644 (file)
@@ -24,7 +24,7 @@ LOG_FMT_ATTRS: dict[str, tuple[str, ...]] = {
     LOG_FMT_ALERT: ('bold', 'bright_red'),
     _LOG_PREFIX_DEFAULT: ('bright_cyan',),
 }
     LOG_FMT_ALERT: ('bold', 'bright_red'),
     _LOG_PREFIX_DEFAULT: ('bright_cyan',),
 }
-_WRAP_INDENT = 3
+_WRAP_INDENT = 2
 
 _MIN_HEIGHT = 4
 _MIN_WIDTH = 32
 
 _MIN_HEIGHT = 4
 _MIN_WIDTH = 32
index 84238804737730e5a366b115a8fc88e4068be49b..d2eb6fd624b951e4033ef1581652141f802224c5 100644 (file)
@@ -17,7 +17,7 @@ log 1 >.. NICK :foo
 insert trigger-ping : +0
 loggedservermsg 0 1 <.. :*.?.net PONG *.?.net :what's up?
 loggedservermsg 0 1 <.. :*.?.net NOTICE * :*** Looking up your ident...
 insert trigger-ping : +0
 loggedservermsg 0 1 <.. :*.?.net PONG *.?.net :what's up?
 loggedservermsg 0 1 <.. :*.?.net NOTICE * :*** Looking up your ident...
-log 2 <.. (server) *** Looking up your ident...
+log 2 <.. ({bold|server}) *** Looking up your ident...
 # another timeout instead of pong? disconnect
 insert trigger-ping : +0
 servermsg 0 timeout
 # another timeout instead of pong? disconnect
 insert trigger-ping : +0
 servermsg 0 timeout
index d0cc2a3cc0cf99b736b912924c2bd60114b7a038..729808d58c05a81a8c3f69f544f0a905f6f25ca5 100644 (file)
@@ -23,11 +23,11 @@ log 1 >.. NICK :foo
 × conn_init_1
 # expect some NOTICE and PING to process/reply during initiation
 loggedservermsg 0 1 <.. :*.?.net NOTICE * :*** Looking up your ident...
 × conn_init_1
 # expect some NOTICE and PING to process/reply during initiation
 loggedservermsg 0 1 <.. :*.?.net NOTICE * :*** Looking up your ident...
-log 2 <.. (server) *** Looking up your ident...
+log 2 <.. ({bold|server}) *** Looking up your ident...
 loggedservermsg 0 1 <.. :*.?.net NOTICE * :*** Looking up your hostname...
 loggedservermsg 0 1 <.. :*.?.net NOTICE * :*** Looking up your hostname...
-log 2 <.. (server) *** Looking up your hostname...
+log 2 <.. ({bold|server}) *** Looking up your hostname...
 loggedservermsg 0 1 <.. :*.?.net NOTICE * :*** Found your hostname (baz.bar.foo)
 loggedservermsg 0 1 <.. :*.?.net NOTICE * :*** Found your hostname (baz.bar.foo)
-log 2 <.. (server) *** Found your hostname (baz.bar.foo)
+log 2 <.. ({bold|server}) *** Found your hostname (baz.bar.foo)
 loggedservermsg 0 1 <.. PING :?
 log 1 >.. PONG :?
 # handle 433
 loggedservermsg 0 1 <.. PING :?
 log 1 >.. PONG :?
 # handle 433
@@ -103,7 +103,7 @@ loggedservermsg 0 1 <.. :foo1 MODE foo1 :+Ziw
 log 1 $.. users:me:modes set to: [+Ziw]
 # handle bot query NOTICE
 loggedservermsg 0 1 <.. :SaslServ!SaslServ@services.bar.baz NOTICE foo1 :Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
 log 1 $.. users:me:modes set to: [+Ziw]
 # handle bot query NOTICE
 loggedservermsg 0 1 <.. :SaslServ!SaslServ@services.bar.baz NOTICE foo1 :Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
-log 3 <.. (SaslServ) Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
+log 3 <.. ({bold|SaslServ}) Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
 
 × during_conn
 # test recoverable 432
 
 × during_conn
 # test recoverable 432
@@ -133,7 +133,7 @@ log 4 $.. residents: bar, foo1
 loggedservermsg 0 1 <.. :bar!~bar@bar.bar PRIVMSG #test :hi there
 log 1 $.. users:1:user set to: [~bar]
 log 1 $.. users:1:host set to: [bar.bar]
 loggedservermsg 0 1 <.. :bar!~bar@bar.bar PRIVMSG #test :hi there
 log 1 $.. users:1:user set to: [~bar]
 log 1 $.. users:1:host set to: [bar.bar]
-log 4 <.. [bar] hi there
+log 4 <.. [{bold|bar}] hi there
 # check _changing_ TOPIC message is communicated to channel window, as long as either content or who change
 loggedservermsg 0 1 <.. :bar!~bar@bar.bar TOPIC #test :foo bar baz
 log 1 $.. channels:#test:topic set to: [Topic(what='foo bar baz', who=NickUserHost(nick='bar', user='~bar', host='bar.bar'))]
 # check _changing_ TOPIC message is communicated to channel window, as long as either content or who change
 loggedservermsg 0 1 <.. :bar!~bar@bar.bar TOPIC #test :foo bar baz
 log 1 $.. channels:#test:topic set to: [Topic(what='foo bar baz', who=NickUserHost(nick='bar', user='~bar', host='bar.bar'))]
@@ -170,16 +170,16 @@ log 1 $..   me
 log 5 $.. residents: baz, foo1
 # handle query window with known user
 loggedservermsg 0 1 <.. :baz!~baz@baz.baz PRIVMSG foo1 :hi there
 log 5 $.. residents: baz, foo1
 # handle query window with known user
 loggedservermsg 0 1 <.. :baz!~baz@baz.baz PRIVMSG foo1 :hi there
-log 6 <.. [baz] hi there
+log 6 <.. [{bold|baz}] hi there
 > /privmsg baz hello, how is it going
 log 1 >.. PRIVMSG baz :hello, how is it going
 > /privmsg baz hello, how is it going
 log 1 >.. PRIVMSG baz :hello, how is it going
-log 6 >.. [foo1] hello, how is it going
+log 6 >.. [{bold|foo1}] hello, how is it going
 loggedservermsg 0 1 <.. :baz!~baz@baz.baz PRIVMSG foo1 :fine!
 loggedservermsg 0 1 <.. :baz!~baz@baz.baz PRIVMSG foo1 :fine!
-log 6 <.. [baz] fine!
+log 6 <.. [{bold|baz}] fine!
 # handle failure to query absent user
 > /privmsg barbar hello!
 log 1 >.. PRIVMSG barbar :hello!
 # handle failure to query absent user
 > /privmsg barbar hello!
 log 1 >.. PRIVMSG barbar :hello!
-log 7 >.. [foo1] hello!
+log 7 >.. [{bold|foo1}] hello!
 loggedservermsg 0 1 <.. :*.?.net 401 foo1 barbar :No such nick/channel
 log 7 $!. barbar not online
 # handle non-self renaming
 loggedservermsg 0 1 <.. :*.?.net 401 foo1 barbar :No such nick/channel
 log 7 $!. barbar not online
 # handle non-self renaming
index b3eb39c8b6ae264792084741628dc32481eaa4bb..b0aca13087038ffb22b24781eadb5f7f5724573c 100644 (file)
@@ -157,9 +157,9 @@ line 21 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /6 u
 line 22 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /7 unknown§§
 line 23 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /foo_0123456789_0123456789_01234567 unknown§§
 line 24 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /foo_0123456789_0123456789_012345678§§
 line 22 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /7 unknown§§
 line 23 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /foo_0123456789_0123456789_01234567 unknown§§
 line 24 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /foo_0123456789_0123456789_012345678§§
-line 25 on_black,bright_red,bold     unknown§§
+line 25 on_black,bright_red,bold    unknown§§
 line 26 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /bar_0123456789_0123456789_012345678§§
 line 26 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /bar_0123456789_0123456789_012345678§§
-line 27 on_black,bright_red,bold     unknown§§
+line 27 on_black,bright_red,bold    unknown§§
 line 28 on_black,bright_cyan #.. §§:§§:§§ windows available via /window:§§
 line 29 on_black,bright_cyan #.. §§:§§:§§   0) :start§§
 line 30 on_black,bright_cyan #.. §§:§§:§§   1) foo.bar.baz:debug§§
 line 28 on_black,bright_cyan #.. §§:§§:§§ windows available via /window:§§
 line 29 on_black,bright_cyan #.. §§:§§:§§   0) :start§§
 line 30 on_black,bright_cyan #.. §§:§§:§§   1) foo.bar.baz:debug§§
@@ -187,9 +187,9 @@ line 18 on_black,bright_green >.. §§:§§:§§ NICK :foo§§
 line 19 on_black,bright_white <.. §§:§§:§§ PING :?
 line 20 on_black,bright_green >.. §§:§§:§§ PONG :?
 line 21 on_black,bright_white <.. §§:§§:§§ PING :123456789 123456789 123456789 123456789 123456789 123456789§§
 line 19 on_black,bright_white <.. §§:§§:§§ PING :?
 line 20 on_black,bright_green >.. §§:§§:§§ PONG :?
 line 21 on_black,bright_white <.. §§:§§:§§ PING :123456789 123456789 123456789 123456789 123456789 123456789§§
-line 22 on_black,bright_white     123456789 123456789§§
+line 22 on_black,bright_white    123456789 123456789§§
 line 23 on_black,bright_green >.. §§:§§:§§ PONG :123456789 123456789 123456789 123456789 123456789 123456789§§
 line 23 on_black,bright_green >.. §§:§§:§§ PONG :123456789 123456789 123456789 123456789 123456789 123456789§§
-line 24 on_black,bright_green     123456789 123456789§§
+line 24 on_black,bright_green    123456789 123456789§§
 line 25 on_black,bright_white <.. §§:§§:§§ PING :foo
 line 26 on_black,bright_green >.. §§:§§:§§ PONG :foo
 line 27 on_black,bright_white <.. §§:§§:§§ PING :bar
 line 25 on_black,bright_white <.. §§:§§:§§ PING :foo
 line 26 on_black,bright_green >.. §§:§§:§§ PONG :foo
 line 27 on_black,bright_white <.. §§:§§:§§ PING :bar
diff --git a/src/tests/tui_line_formattings.test b/src/tests/tui_line_formattings.test
new file mode 100644 (file)
index 0000000..fbf3ade
--- /dev/null
@@ -0,0 +1,76 @@
+> /connect foo.bar.baz foo bar:baz
+log 1 $.. isupport cleared
+log 1 $.. isupport:CHANTYPES set to: [#&]
+log 1 $.. isupport:PREFIX set to: [(ov)@+]
+log 1 $.. isupport:USERLEN set to: [10]
+log 1 $.. caps cleared
+log 1 $.. users cleared
+log 1 $.. channels cleared
+log , $.. DISCONNECTED
+log 1 $.. hostname set to: [foo.bar.baz]
+log 1 $.. port set to: [-1]
+log 1 $.. nick_wanted set to: [foo]
+log 1 $.. user_wanted set to: [baz]
+log 1 $.. realname set to: [bar]
+log 1 $.. port set to: [6697]
+log 1 $.. connection_state set to: [connecting]
+log 1 $.. connection_state set to: [connected]
+log , $.. CONNECTED
+log 1 >.. CAP LS :302
+log 1 >.. USER baz 0 * :bar
+log 1 >.. NICK :foo
+> /window 1
+loggedservermsg 0 1 <.. :foo.bar.baz 001 foo :Welcome to the foo.bar.baz network
+log 1 $.. users:me:nick set to: [?]
+log 1 $.. users:me:nick set to: [foo]
+
+# check full line not wrapped
+loggedservermsg 0 1 <.. :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 12345678 0
+line 21 on_black,bright_white <.. §§:§§:§§ :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 12345678 0§§
+
+# check wrap if last space-separated item one char too long 
+loggedservermsg 0 1 <.. :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 12345678 01
+line 20 on_black,bright_white <.. §§:§§:§§ :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 12345678§§
+line 21 on_black,bright_white    01§§
+
+# check wrap if item starts right after width-final space
+loggedservermsg 0 1 <.. :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 123456789 1
+line 20 on_black,bright_white <.. §§:§§:§§ :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 123456789§§
+line 21 on_black,bright_white    1§§
+
+# check wrap if item starts right after space after item extending to end of width
+loggedservermsg 0 1 <.. :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 1234567890 2
+line 20 on_black,bright_white <.. §§:§§:§§ :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 1234567890§§
+line 21 on_black,bright_white    2§§
+
+# check wrap if item starts right after double-space after item extending to end of width
+loggedservermsg 0 1 <.. :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 1234567890  3
+line 20 on_black,bright_white <.. §§:§§:§§ :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 1234567890§§
+line 21 on_black,bright_white     3§§
+
+# check wrap on item too large to fit into screen width minus indent
+loggedservermsg 0 1 <.. :foo.bar.baz 001 foo :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_2345678
+line 19 on_black,bright_white <.. §§:§§:§§ :foo.bar.baz 001 foo§§
+line 20 on_black,bright_white    :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_234567§§
+line 21 on_black,bright_white   8
+
+# check wrapping calculation on double-width character (tbh not much of a test since the tester itself counts specifically this char as two, so it's pretty much the same as above testing with a sequence of two ASCII chars; mostly just ensures that the wrapping code relies on Terminal.length_to_term)
+loggedservermsg 0 1 <.. :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 1234567 💓
+line 21 on_black,bright_white <.. §§:§§:§§ :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 1234567 💓§§
+loggedservermsg 0 1 <.. :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 12345678 💓
+line 20 on_black,bright_white <.. §§:§§:§§ :foo.bar.baz 001 foo :6789 123456789 123456789 123456789 12345678§§
+line 21 on_black,bright_white    💓§§
+loggedservermsg 0 1 <.. :foo.bar.baz 001 foo :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_23456💓
+line 19 on_black,bright_white <.. §§:§§:§§ :foo.bar.baz 001 foo§§
+line 20 on_black,bright_white    :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_23456§§
+line 21 on_black,bright_white   💓§§
+
+# check interpretation and escape of formatting characters
+servermsg 0 :*.?.net NOTICE * :*** checking {esc|ape}s, formatting not counting into wrap
+log 1 <.. :*.?.net NOTICE * :*** checking {{esc|ape{}s, formatting not counting into wrap
+log 2 <.. ({bold|server}) *** checking {{esc|ape{}s, formatting not counting into wrap
+line 20 on_black,bright_white <.. §§:§§:§§ :*.?.net NOTICE * :*** checking {esc|ape}s, formatting not counting§§
+line 21 on_black,bright_white    into wrap§§
+> /window 2
+line 21 on_black,bright_white <.. §§:§§:§§ (§§§§§§) *** checking {esc|ape}s, formatting not counting into wrap§§
+line 21 on_black,bright_white,bold §§§§§§§§§§§§§§server§