Partagez
Aller en bas
avatar
Berka
Administrateur

Nombre de messages : 1831
Age : 28
Localisation : Paris
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Console RGSS3 avancée

le Sam 21 Jan 2012 - 18:14
Bonsoir à tous,

Je pense que l'ajout de la console aura été la plus grande innovation de RMVX Ace. Super pratique pour le débugage des scripts.
Et c'est pourquoi je n'ai pas pu résister à l'envie de personnaliser un peu ce formidable outil.

Grâce à ce script (mon premier sur Ace, faut bien vivre avec son temps) vous aurez la possibilité de colorer les chaines affichées par la consoles.
Cela permet également de faire un rapide outil de coloration syntaxique. Un screenshot parlant mieux de la question que des phrases:


Pour ce faire, copiez ce script tout en haut de la liste (Avant Vocab).

Code:
#============================================================
#                    Advanced RGSS3 Console
#  Berka          http://www.rpgmakervx-fr.com
#                  v0.5 VX Ace only. 01-21-12 
#
# Thanks to Azuma-01 for symbols and regexp matching
# Free of use. Please ask me before publishing anywhere.
#
# Add a basic syntax haighlighter to the default RGSS Console
# May cause a slight slowdown in the console display.
#------------------------------------------------------------
# Use Kernel#puts to activate the syntax highlighter.
# Kernel#print stays unchanged.$
# Console#gets extracts the input of the console
#  use: eval(Console.gets) to script while testing.
#------------------------------------------------------------
# Change the color of the console:
#  Console.color(H_RED)      # Set the color of the console
#  print("this text is red")  # Text displayed in red
#  Console.color = nil        # Remove the coloration
#============================================================

module Berka
  module Console
    LINE_NUMBERS = true  # Display line numbers ON/OFF
    BACKGROUND  = true  # Display a white background ON/OFF
    ENABLEPROMPT = true  # Enable the gets command ON/OFF
    PARSE_P      = false # Enable parsing for Kernel#p function /!\
  end
end

module Win32
  GSH ||= Win32API.new('kernel32','GetStdHandle','l','l')
  SCTA||= Win32API.new('kernel32','SetConsoleTextAttribute','ll','l')
end

module Highlighter 
  H_BLACK    = 0x0000 # black
  H_DBLUE    = 0x0001 # dark blue
  H_DGREEN    = 0x0002 # dark green
  H_DCYAN    = 0x0003 # dark cyan
  H_DRED      = 0x0004 # dark red
  H_DPURPLE  = 0x0005 # dark purple
  H_DYELLOW  = 0x0006 # dark yellow
  H_GREY      = 0x0007 # grey
  H_DGREY    = 0x0008 # dark grey
  H_BLUE      = 0x0009 # blue
  H_GREEN    = 0x000a # green
  H_CYAN      = 0x000b # cyan
  H_RED      = 0x000c # red
  H_PURPLE    = 0x000d # purple
  H_YELLOW    = 0x000e # yellow
  H_WHITE    = 0x000f # white
  H_INTENSITY = 0x0080 # background intensity
 
  # Ruby's special words
  H_KWORDS=["alias","begin","BEGIN","break","case","defined","do","else","elsif",
            "end","END","ensure","for","if","in","include","loop","next","raise",
            "redo","rescue","retry","return","super","then","undef","unless",
            "until","when","while","yield","false","nil","self","true","__FILE__",
            "__LINE__","and","not","or","def","class","module","catch","fail",
            "load","throw"]
           
  # Ruby's operators
  H_OPERATORS=["=","+","-","/","*","%",'(',')','[',']','{','}','<','>','&','|',
              ',','!',"?",":",";",'.']
 
  def self.parse(*args)
    args.flatten.each{|l|
      Console.color=nil
      print("#{sprintf("%03d",$consolelines+=1)}:\s")if Berka::Console::LINE_NUMBERS
      l.split(/ /).each{|e|
        case e
        when *H_KWORDS then Console.color=H_BLUE
        when /^\d*[.]?\d+$/ then Console.color=H_DRED
        when /\/.*\/(?:[imx]{,3})/ then Console.color=H_DPURPLE # by Azuma-01
        when /^:.*$/ then Console.color=H_DYELLOW # by Azuma-01
        when /^#.*$/ then Console.color=H_DGREEN # by Azuma-01
        else
          e.split(//).each{|f|
            @s=!@s if r=(f=='"'||f=="'")
            if(@s)||r;Console.color=H_DPURPLE
            elsif f=~/^\d*[.]?\d+$/;Console.color=H_DRED
            else
              Console.color=(H_OPERATORS.include?(f)? H_DCYAN : H_BLACK)
            end
            print(f)
          }
          print(" ")
          next
        end
        print("#{e} ")
      }
    }
    print("\n")
  end
end

include Highlighter

module Console
  $consolelines=0 # Console lines counter
  def self.init
    @outhwnd=Win32::GSH.call(-11)
  end
  def self.color=(c=H_BLACK)
    Win32::SCTA.call(@outhwnd,(c||=H_BLACK)|(Berka::Console::BACKGROUND ? 0x00f0 : 0))# rescue nil
  end
  def self.gets
    $stdin.gets
  end
end
Console.init

# Kernel#puts redefinition
def puts(*a)
  a.each{|n|Highlighter.parse(*n)}
end
#Kernel#p redefinition
def p(*a)
  Berka::Console::PARSE_P ? (a.each{|b|puts b.inspect}) : Kernel.p(*a)
end
# Kernel#gets
def gets
  Console.gets
end


L'utilisation est simple:
- une fonction gets est ajoutée pour extraire la saisie console
- la fonction puts active la coloration syntaxique, faites: puts("[1,2,3]")
- la fonction print est laissée telle quelle.
- pour changer de couleur d'affichage: Console.color = H_RED Vous trouverez les codes couleurs au début du script.

Merci de me demander la permission avant de copier ce script à droite à gauche. Tout simplement pour que je puisse moi-même assurer le support du système.

Berka



Dernière édition par Berka le Mer 25 Jan 2012 - 0:42, édité 4 fois
avatar
Gummy
Staffeux retraité

Nombre de messages : 2666
Age : 27
Localisation : Belgique
Distinction : Modérateur imprévisible

Papy Lolo' [Nabots Nimousse]


Date d'inscription : 27/01/2008

Re: Console RGSS3 avancée

le Sam 21 Jan 2012 - 18:22
Sympa tout ça Smile

Merci Berka!
avatar
Asagi
Membre

Nombre de messages : 290
Age : 24
Localisation : France
Distinction : aucune
Date d'inscription : 30/01/2011

Re: Console RGSS3 avancée

le Sam 21 Jan 2012 - 18:49
J'avoue merci du partage Smile
avatar
Master of Dragons
Membre

Nombre de messages : 200
Age : 26
Localisation : Toujours là (même absent)
Distinction : aucune
Date d'inscription : 28/07/2010

Re: Console RGSS3 avancée

le Dim 22 Jan 2012 - 1:55
Berka toujours là !
Mais je me demande purquoi tu n'as pas de points de participation...

EDIT : ça a été modifié ^^


Dernière édition par Master of Dragons le Dim 22 Jan 2012 - 16:12, édité 1 fois
avatar
Gummy
Staffeux retraité

Nombre de messages : 2666
Age : 27
Localisation : Belgique
Distinction : Modérateur imprévisible

Papy Lolo' [Nabots Nimousse]


Date d'inscription : 27/01/2008

Re: Console RGSS3 avancée

le Dim 22 Jan 2012 - 1:59
C'est un admin, nous ne pouvons pas modifier les infos des admins Wink
avatar
Azuma-01
Membre

Nombre de messages : 94
Age : 26
Localisation : Amos
Distinction : aucune
Date d'inscription : 22/09/2009

Re: Console RGSS3 avancée

le Mar 24 Jan 2012 - 19:28
Très beau travail, mais les regexp et les symbole ne sont pas colorier.
Il faudrait ajouter ces lignes dans Highlighter.prase
Code:
when /\/.*\/(?:[imx]{,3})/ then Console.color=H_DPURPLE
when /^:.*$/ then Console.color=H_DYELLOW
Et pour ceux qui voudrait redefinir p :
Code:
def p(*a)
  a.each{|b|puts b.inspect}
end

EDIT:
Il manque aussi le 'K' de H_BLACK dans la ligne
Code:
else;Console.color=H_OPERATORS.include?(f)? H_DCYAN : H_BLAC
avatar
Berka
Administrateur

Nombre de messages : 1831
Age : 28
Localisation : Paris
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: Console RGSS3 avancée

le Mar 24 Jan 2012 - 23:51
Bien vu azuma ! Sous VX les symboles n'étaient pas colorés je crois. Du coup je n'y ai pas pensé.
J'ajoute cela dans le script !

Vous utiliserez la colo pour Kernel#p ? je me disais qu'il était mieux de le laisser tel quel au cas où moins système plante.
avatar
Azuma-01
Membre

Nombre de messages : 94
Age : 26
Localisation : Amos
Distinction : aucune
Date d'inscription : 22/09/2009

Re: Console RGSS3 avancée

le Mer 25 Jan 2012 - 18:19
@Berka a écrit:Vous utiliserez la colo pour Kernel#p ? je me disais qu'il était mieux de le laisser tel quel au cas où moins système plante.
c'est pour cette raison que j'en ai fait un alias avant, mais le l'ai pas ajouter avec la redéfinition car, le nom que je lui ai donné n'est probablement pas approprié pour les autres.
De toute façons, je considère que les personnes qui vont utiliser la colo en on minimum de connaissance en Ruby, ils seront le faire eux mêmes.

Sinon, en révisant le système de colo des symbole et regexp, j'ai réalisé qu'il ne coloriait pas correctement c'est cas : /regexp avec espaces/i et :'symbole avec espaces'.
donc voici une contre-façon de Highlighter.prase les prenant en charge:
Code:
  def self.parse(*args)
    args.flatten.each{|l|
      Console.color=nil
      print("#{sprintf("%03d",$consolelines+=1)}:\s")if Berka::Console::LINE_NUMBERS
      l.split(/ /).each{|e|
      self.draw(e)
      }
    }
    @c=!@c
    print("\n")
  end
 
  def self.draw(e)
    if @r # in a regexp
      Console.color=H_DPURPLE
      @r=!@r if e=~/^(?:[^\/]|.*)[^\\]\/[mix]{,3}$/
    elsif @sy # in a sysmbol
      Console.color=H_DYELLOW
      @sy = nil if e=~(@sy=='"'?(/^.*[^\\]"$/):(/^.*'$/))
    elsif @c # in a commant
      @c=!@c if e=~/(.*)\n(.*)/
      Console.color=H_DGREEN
      if $1
        print $1,"\n"
        self.draw $2
        return e
      end
    else
      case e
      when *H_KWORDS then Console.color=H_BLUE
      when /^\d*[.]?\d+$/ then Console.color=H_DRED
      when /^#.*$/ then @c=!@c; Console.color=H_DGREEN # commant
      when /^\/.*(?:[^\/]|\\\/)$/ then @r=!@r; Console.color=H_DPURPLE # regexp with spaces
      when /^\/.*\/(?:[imx]{,3})$/ then Console.color=H_DPURPLE # one word regexp
      when (/^:["'].*[^#{e[1]}]$/ rescue nil) then @sy=e[1]; Console.color=H_DYELLOW # symbol with spaces
      when /^:.*+$/ then Console.color=H_DYELLOW # one word symbol
      else
        e.split(//).each{|f|
          @s=!@s if r=(f=='"'||f=="'")
          if(@s)||r;Console.color=H_DPURPLE
          elsif f=~/^\d*[.]?\d+$/;Console.color=H_DRED
          else;Console.color=H_OPERATORS.include?(f)? H_DCYAN : H_BLACK
          end
          print(f)
        }
        return
      end
    end
    print("#{e} ")
  end
end
A+

Edit :
une ligne sans espaces (ou presque) comme celle ci aura des bugs
Code:
puts %q{def met(a="QUOTE#{"bob"}",b=/regexp with spaces/,:"bug bug")#commant}
Contenu sponsorisé

Re: Console RGSS3 avancée

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum