Register forum user name Search FAQ

Gammon Forum

Notice: Any messages purporting to come from this site telling you that your password has expired, or that you need to verify your details, confirm your email, resolve issues, making threats, or asking for money, are spam. We do not email users with any such messages. If you have lost your password you can obtain a new one by using the password reset link.
 Entire forum ➜ MUSHclient ➜ General ➜ Formatting Smaug progs

Formatting Smaug progs

It is now over 60 days since the last post. This thread is closed.     Refresh page


Pages: 1 2  

Posted by Zeno   USA  (2,871 posts)  Bio
Date Sun 22 Feb 2009 07:51 PM (UTC)

Amended on Mon 23 Feb 2009 12:35 AM (UTC) by Zeno

Message
So I'm thinking about writing a plugin for MUSHclient that would format the display of progs in Smaug. Say if I mpstat'd a mob, it would rewrite the ouput to maybe something color coded. Whatever would help the builder read it better.

Considering builders sometime indent progs their self, probably leave that alone. Thoughts of what this should do? Maybe color each ifcheck (and what it contains) a different color?

Here's an example I would need to parse:
>speech_prog yes
if ispc($n)
 if hasqbit($n) == 55
  tsk
 else
  if handsfull($n)
   mea $n Your hands are full, Snoopy implies.
   break
  endif
  mpqset $n 55
  if rand(25)
   mpoload 1029
   give hat $n
   break
   endif
  if rand(33)
   mpoload 1030
    give suit $n
   break
  endif
  if rand(50)
   mpoload 1031
   give boots $n
   break
   endif
  mpoload 1032
  give beard $n
 endif
endif


Anyone else up to working on this with me?

Pseudo code stuff:
First we need to match something to know we're reading a prog. Progs start off with:
Quote:
>greet_prog 100

So what if we match that? Something like...
^>*_prog (.*?)$


And then we start matching in the prog
^if (.*?)$

^else (.*?)$

^break$

^endif$

etc

I suppose it wouldn't hurt put in an option to indent the prog as well if needed.


[EDIT] Here are some basic color changing triggers for a start:
<triggers>
  <trigger
   custom_colour="14"
   enabled="y"
   match="^&gt;(.*?)_prog (.*?)$"
   regexp="y"
   sequence="100"
  >
  </trigger>
</triggers>

<triggers>
  <trigger
   custom_colour="7"
   enabled="y"
   match="^[\s]*break$"
   regexp="y"
   sequence="100"
  >
  </trigger>
</triggers>

<triggers>
  <trigger
   custom_colour="3"
   enabled="y"
   keep_evaluating="y"
   match="^[\s]*else$"
   regexp="y"
   sequence="100"
  >
  </trigger>
</triggers>

<triggers>
  <trigger
   custom_colour="2"
   enabled="y"
   match="^[\s]*endif$"
   regexp="y"
   sequence="100"
  >
  </trigger>
</triggers>

<triggers>
  <trigger
   custom_colour="11"
   enabled="y"
   match="^[\s]*if (.*?)$"
   regexp="y"
   sequence="100"
  >
  </trigger>
</triggers>

<triggers>
  <trigger
   custom_colour="12"
   enabled="y"
   match="^[\s]*mp[\S]* "
   regexp="y"
   sequence="100"
  >
  </trigger>
</triggers>


[EDIT 2] I have this on the _prog regex:
inprog = 1
indentnum = 0
EnableTrigger("force_indent", true)

But I don't know how to indent lines. The force_indent trigger is a regex that matches anything, but it overwrites everything else.

Zeno McDohl,
Owner of Bleached InuYasha Galaxy
http://www.biyg.org
Top

Posted by Zeno   USA  (2,871 posts)  Bio
Date Reply #1 on Mon 23 Feb 2009 02:29 AM (UTC)
Message
Converting this into a plugin gives me this error:
Run-time error
Plugin: Smaug_prog_parse (called from world: SBI)
Function/Sub: SendEndifNote called by trigger
Reason: processing trigger ""
[string "Plugin"]:12: attempt to concatenate field '?' (a nil value)
stack traceback:
        [string "Plugin"]:12: in function <[string "Plugin"]:11>
Error context in script:
   8 :  ColourNote("yellowgreen", "black", "else ", "deepskyblue", "black", "//if "..ifchecklist[indentnum])
   9 : end -- function
  10 : 
  11 : function SendEndifNote (str)
  12*:  ColourNote("yellowgreen", "black", "endif ", "deepskyblue", "black", "//if "..ifchecklist[indentnum])
  13 : if inprog == 1 then
  14 :  indentnum = indentnum - 1
  15 : end
  16 : end -- function


Lua.

ifchecklist and indentnum are valid. Tried changing them to local, didn't help.

Zeno McDohl,
Owner of Bleached InuYasha Galaxy
http://www.biyg.org
Top

Posted by Nick Gammon   Australia  (23,120 posts)  Bio   Forum Administrator
Date Reply #2 on Mon 23 Feb 2009 02:39 AM (UTC)
Message
Hmm, Lua can do subtle things at times, especially if you play with local. ;-)

Try, in the line before the error:


require "tprint"; tprint (ifchecklist)
print (indentnum)


Sometimes things get changed when you don't expect it.

- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Zeno   USA  (2,871 posts)  Bio
Date Reply #3 on Mon 23 Feb 2009 02:41 AM (UTC)

Amended on Mon 23 Feb 2009 02:43 AM (UTC) by Zeno

Message
0
Run-time error
Plugin: Smaug_prog_parse (called from world: SBI)
Function/Sub: SendEndifNote called by trigger
Reason: processing trigger ""
[string "Plugin"]:16: attempt to concatenate field '?' (a nil value)
stack traceback:
        [string "Plugin"]:16: in function <[string "Plugin"]:13>
Error context in script:
  12 : 
  13 : function SendEndifNote (str)
  14 :  require "tprint"; tprint (ifchecklist)
  15 :  print (indentnum)
  16*:  ColourNote("yellowgreen", "black", "endif ", "deepskyblue", "black", "//if "..ifchecklist[indentnum])
  17 : if inprog == 1 then
  18 :  indentnum = indentnum - 1
  19 : end
  20 : end -- function

Zeno McDohl,
Owner of Bleached InuYasha Galaxy
http://www.biyg.org
Top

Posted by Zeno   USA  (2,871 posts)  Bio
Date Reply #4 on Mon 23 Feb 2009 02:45 AM (UTC)
Message
Here's the full plugin. Was in the middle of messing with it to fix it, may have some incomplete things:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE muclient>
<!-- Saved on Sunday, February 22, 2009, 9:54 PM -->
<!-- MuClient version 4.35 -->

<!-- Plugin "Smaug_prog_parse" generated by Plugin Wizard -->

<muclient>
<plugin
   name="Smaug_prog_parse"
   author="Zeno"
   id="ec235cde57534866595eed2a"
   language="Lua"
   purpose="Parses Smaug progs (colors, ifcheck matching, etc)"
   date_written="2009-02-22 21:53:24"
   requires="4.35"
   version="1.0"
   >

</plugin>

<!--  Triggers -->

<triggers>

  <trigger
   custom_colour="17"
   enabled="y"
   match="^[\s]*break$"
   regexp="y"
   sequence="100"
   other_text_colour="firebrick"
  >
  </trigger>

  <trigger
   custom_colour="17"
   enabled="y"
   match="^[\s]*mp[\S]* "
   regexp="y"
   sequence="100"
   other_text_colour="violet"
  >
  </trigger>

  <trigger
   custom_colour="17"
   enabled="y"
   match="^&gt;(.*?)_prog (.*?)$"
   regexp="y"
   send_to="12"
   sequence="100"
   other_text_colour="seagreen"
  >
  <send>inprog = true
</send>
  </trigger>

  <trigger
   custom_colour="17"
   enabled="y"
   match="^[\s]*if (?P&lt;ifcheck&gt;.*?)$"
   regexp="y"
   send_to="12"
   sequence="100"
   other_text_colour="coral"
  >
  <send>if inprog == true then
 indentnum = indentnum + 1
 ifchecklist[indentnum] = "%&lt;ifcheck&gt;"
end</send>
  </trigger>

  <trigger
   enabled="y"
   match="^[\s]*endif$"
   omit_from_output="y"
   regexp="y"
   script="SendEndifNote"
   sequence="100"
  >
  </trigger>

  <trigger
   enabled="y"
   match="^\s*$"
   regexp="y"
   send_to="12"
   sequence="100"
  >
  <send>if inprog == true then
 indentnum = 0
 inprog = 0
end</send>
  </trigger>

  <trigger
   enabled="y"
   match="^[\s]*else$"
   omit_from_output="y"
   regexp="y"
   script="SendElseNote"
   send_to="12"
   sequence="100"
  >
  </trigger>

</triggers>


<!--  Script  -->

<script>
<![CDATA[
local indentnum, ifchecks, ifchecklist, inprog
inprog = false
indentnum = 0
ifchecks = 0
ifchecklist = {}

function SendElseNote (str)
 require "tprint"; tprint (ifchecklist)
 print (indentnum)
 ColourNote("yellowgreen", "black", "else ", "deepskyblue", "black", "//if "..ifchecklist[indentnum])
end -- function

function SendEndifNote (str)
 require "tprint"; tprint (ifchecklist)
 print (indentnum)
 ColourNote("yellowgreen", "black", "endif ", "deepskyblue", "black", "//if "..ifchecklist[indentnum])
if inprog == 1 then
 indentnum = indentnum - 1
end
end -- function

function InProgTrue (what)
inprog = true
end -- function
]]>
</script>


</muclient>

Zeno McDohl,
Owner of Bleached InuYasha Galaxy
http://www.biyg.org
Top

Posted by Nick Gammon   Australia  (23,120 posts)  Bio   Forum Administrator
Date Reply #5 on Mon 23 Feb 2009 03:08 AM (UTC)

Amended on Mon 23 Feb 2009 03:09 AM (UTC) by Nick Gammon

Message
See this:


<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE muclient>

<muclient>
<plugin
   name="Local_Test"
   author="Nick Gammon"
   id="dc0d7a3af05433f612a2627b"
   language="Lua"
   purpose="tests local declaration"
   date_written="2009-02-23 15:04:15"
   requires="4.40"
   version="1.0"
   >

</plugin>


<!--  Aliases  -->

<aliases>
  <alias
   match="zeno"
   enabled="y"
   send_to="12"
   sequence="100"
  >
  <send>

print ("indentnum=", indentnum)

</send>
  </alias>
</aliases>

<!--  Script  -->


<script>
<![CDATA[
local indentnum, ifchecks, ifchecklist, inprog
inprog = false
indentnum = 0
]]>
</script>


</muclient>


Test:


zeno

Output

indentnum= nil



Remove the "local" in front of indentnum. You are giving your script a different copy to what the alias gets (or the trigger, or whatever).

Local variables are local to a compiled block. The script is compiled at one time, the trigger/alias "send to script" are compiled at a different time, in different blocks.

- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Zeno   USA  (2,871 posts)  Bio
Date Reply #6 on Mon 23 Feb 2009 03:33 AM (UTC)
Message
Thanks, that's what I had before I changed it to local to see if that would fix it. Somehow it works now though.

Here is a preview of the plugin on the imp prog:
http://img.photobucket.com/albums/v123/rebirthseph/mc_plugin_prog.png

It generates C++ style comments on if/elses.

Zeno McDohl,
Owner of Bleached InuYasha Galaxy
http://www.biyg.org
Top

Posted by Nick Gammon   Australia  (23,120 posts)  Bio   Forum Administrator
Date Reply #7 on Mon 23 Feb 2009 03:39 AM (UTC)
Message
Very nice.

- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Zeno   USA  (2,871 posts)  Bio
Date Reply #8 on Mon 23 Feb 2009 04:59 AM (UTC)

Amended on Mon 23 Feb 2009 05:00 AM (UTC) by Zeno

Message
Is there some special way to use entities with ColourNote?
  <!ENTITY else_color "yellowgreen" >

ColourNote("&else_color;", "black", "else ")


It's being colored as default Note().

Zeno McDohl,
Owner of Bleached InuYasha Galaxy
http://www.biyg.org
Top

Posted by Nick Gammon   Australia  (23,120 posts)  Bio   Forum Administrator
Date Reply #9 on Mon 23 Feb 2009 05:05 AM (UTC)
Message
The CDATA is suppressing the entity replacement. Try something like this:


<!--  Script  -->

<script>

else_color = "&else_color;"

<![CDATA[


-- later on ...

ColourNote(else_color, "black", "else ")


- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Zeno   USA  (2,871 posts)  Bio
Date Reply #10 on Mon 23 Feb 2009 05:11 AM (UTC)

Amended on Mon 23 Feb 2009 06:19 AM (UTC) by Zeno

Message
Thanks. What about when I am using Note or ColourNote, is there a way to make it the last color from the MUD? I am giving an option to disable syntax coloring, but when I suppress the output of an else and replace it to add on the C++ style comment to show what ifcheck it came from, it is using the default Note() color.

Or some way to simply append to the out of an output line on the MUD.

[EDIT] v1 release: http://zeno.biyg.org/~zeno/Smaug_prog_parse.xml

Zeno McDohl,
Owner of Bleached InuYasha Galaxy
http://www.biyg.org
Top

Posted by Worstje   Netherlands  (899 posts)  Bio
Date Reply #11 on Mon 23 Feb 2009 06:40 AM (UTC)

Amended on Mon 23 Feb 2009 06:44 AM (UTC) by Worstje

Message
You'll probably want to do something along the following lines:



function GetLastColours()
  -- Calculate the line number.
  local most_recent_line = GetLinesInBufferCount()-1
  
  -- Obtain the amount of styles on the most recent line.
  local last_style = GetLineInfo(most_recent_line, 11)
  
  -- Obtain colours in RGB format.
  local last_fg_rgb = GetStyleInfo(most_recent_line, last_style, 14)
  local last_bg_rgb = GetStyleInfo(most_recent_line, last_style, 15)
  
  -- Convert them to a format ColourTell/ColourNote can use.
  local last_fg = RGBColourToName(last_fg_rgb)
  local last_bg = RGBColourToName(last_bg_rgb)
  
  return last_fg, last_bg
end

-- Use like:
ColourNote(unpack(GetLastColours()), "Dumdeedum.")

-- or...
local fg, bg = GetLastColours()
ColourNote(fg, bg, "Dumdeedum once more.")


Do note that I did not test this code, nor that it handles the case in which there is no output whatsoever in the window. That should not be a problem with your usecase, though.

Edit: Oh wait, you said last color from the mud. That can be done too, but I'm too lazy to work that one out. A for-loop and a check with GetLineInfo() having the InfoType of 4 should probably help...
Top

Posted by Zeno   USA  (2,871 posts)  Bio
Date Reply #12 on Mon 23 Feb 2009 10:35 PM (UTC)
Message
What if the line was omitted from output per a trigger? That would probably be the line I need to get the style from, will GetLinesInBufferCount count omitted lines?

Zeno McDohl,
Owner of Bleached InuYasha Galaxy
http://www.biyg.org
Top

Posted by Nick Gammon   Australia  (23,120 posts)  Bio   Forum Administrator
Date Reply #13 on Mon 23 Feb 2009 10:48 PM (UTC)
Message
If you are using Lua, it is easy because the style runs are passed to the trigger, so you can rework the line, even if it is omitted. That is how the plugins work that send chats to other windows.

- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Zeno   USA  (2,871 posts)  Bio
Date Reply #14 on Sun 01 Mar 2009 07:20 PM (UTC)

Amended on Sun 01 Mar 2009 07:35 PM (UTC) by Zeno

Message
v1.1 released:
-If an ifcheck had an or, it also appends the or in comments
-Command 'ToggleColoring' turns off Syntax Highlighting (keeps comments).
http://i41.tinypic.com/2628nrq.png

DL: http://www.biyg.org/forums/download/file.php?id=7
If link is dead, it's at the bottom here: http://www.biyg.org/forums/viewtopic.php?f=2&t=2167

Nick, is there a simple mouseover function to use? I know there is MiniWindows etc, but I want something simple (like how MC displays the line time).

Zeno McDohl,
Owner of Bleached InuYasha Galaxy
http://www.biyg.org
Top

The dates and times for posts above are shown in Universal Co-ordinated Time (UTC).

To show them in your local time you can join the forum, and then set the 'time correction' field in your profile to the number of hours difference between your location and UTC time.


40,143 views.

This is page 1, subject is 2 pages long: 1 2  [Next page]

It is now over 60 days since the last post. This thread is closed.     Refresh page

Go to topic:           Search the forum


[Go to top] top

Information and images on this site are licensed under the Creative Commons Attribution 3.0 Australia License unless stated otherwise.