π
<-
Chat plein-écran
[^]

[PROJET]LuaCS: l'éditeur du programmeur Lua sur calculatrice

Pour TI-Nspire OS 3.0 ou ultérieur.

[PROJET]LuaCS: l'éditeur du programmeur Lua sur calculatrice

Unread postby yatto » 12 Oct 2011, 19:44

[EDIT] Ce sujet est dédié à mon projet, LuaCS, un éditeur de texte de programmeur Lua pour la calculatrice, en Lua. J'y poserai tous mes problèmes, si quelqu'un trouve une solution, ça me permettra d'avancer jusqu'au moment de la release. Merci beaucoup!

Vous pouvez télécharger une version Work-In-Progress de LuaCS ici:
Télécharger LuaCS-Work In Progress (Archive avec le code et le fichier compilé)

Pour information, je code avec PSPad comme éditeur de texte, avec le fichier texte en ANSI, et je compile avec Luna0.2a de ExtendeD.



----------------------------------------------------------


Bonjour! J'ai un petit problème avec les caractères spéciaux (valides en UTF-8 donc) dans mon programme en Lua.
A vrai dire, c'est un éditeur de texte pour Lua, mon programme. Donc ce serait quand même mieux qu'il accepte les caractères UTF-8.
L'éditeur affiche le numéro de ligne, respecte et reprend les tabulations des lignes précédentes, et colorie quelques mots de Lua (la liste est très petite, mais je vais l'étoffer, pour l'instant c'est pour voir que ça marche). J'ai fait un ascenceur (pas encore utilisable avec la souris, par exemple avec on.mouseMove ou avec une fonction "grab"), et on peut utiliser la souris pour placer le curseur de texte.

Je suis sous Windows (j'ai un Linux à ma disposition s'il faut passer par lui), je compile mon code avec Luna0.2a. Or, avec Luna, mon éditeur de texte n'accepte pas les caractères spéciaux: il écrit des chinoiseries (réellement!). Avec l'outil officiel TI je n'arrive même pas à le lancer (en fait, quand je colle le contenu du presse-papier dans TI-Nspire Student Software, ce dernier se ferme sans demander son reste!)

Et quand j'utilise OnCalcLua (de ExtendeD), quand je tape un caractère spécial puis d'autres caractères, à la place des autres caractères ça m'affiche (j'ai l'impression) des bouts de mon code source ! C'est quoi ce truc?

Y a-t-il un moyen de faire accepter les caractères d'UTF-8, s'il vous plait? Si oui, lequel? J'ai cru lire quelque part qu'on peut le faire depuis Linux, comment le faire dans ce cas, s'il vous plait (je ne suis pas un Power User de Linux, je connais la console sans la maitriser, quoi. Je ne programme pas sous Vim ou Emacs avec Linux, que ce soit dit x) )


Heu, rien à voir avec mon premier problème, mais si vous avez une idée de comment faire pour récupérer le texte tapé avant la fermeture du programme et le réafficher à l'ouverture après, ce serait chouette, parce que je n'en mène pas large, moi.

Voilà mon code, il n'est pas très compréhensible, j'ai essayé de le commenter, mais peut-être que vous pourrez m'aider?


Code: Select all
-- [[LuaCS, by Yatto]]
--[[LuaColorationSytaxique, ou LuaCodeSource]]
--[[ "compilé" avec Luna-0.2a, de ExtendeD
        http://ndlessly.wordpress.com]]
--[[Utilise un bout de Universal Menu, de Spirikoi]]
--[[Merci à Levak pour m'avoir orienté pour faire cet éditeur de texte !]]
local x,y
y=1 --ligne dans la phrase
z=0  --gère le défilement de la fenêtre
i=0 -- donne la première ligne à afficher à l'écran
j=0  -- compteur
x=0 --n° du caractère dans la phrase
recup = false --variable pour la récupération depuis une variable (pas encore implémenté)

buffer = {  --Le buffer, qui contiendra toutes les lignes, et qui est composé de suites de chaînes de caractères
      [1]="",
              }

cs={  [1]="function", --CS comme Coloration Syntaxique: ce sont les mots à colorier
         [2]="gc:",
         [3]=" if ",
         [4]="then",
         [5]="end",
         [6]="while",
         [7]="="
}
color={  [1]="orange", --chaque couleur est associée à un mot de cs
         [2]="gray",
         [3]="blue",
         [4]="blue",
         [5]="green",
         [6]="darkred",
         [7]="brown",
}

--essai de récupération du texte après fermeture en stockant dans une variable, ne marche pas
function on.create()
   rappel()
   if not(recup) then
      table.insert(buffer,1,"¶")
   end
end
function on.destroy()
  tmp=table.concat(buffer, "¶")
  tmp = tmp.."@" 
  var.store("txt",tmp)
end


function rappel()
  tmp=var.recall("txt")
  k=0
  table.remove(buffer,1)
  while not(a==nil) do
     k=k+1
     a,dummy=string.find(tmp,"@",0)
    if not(a==nil) then
        sub=string.sub(tmp,0,a-1)
         tmp=string.sub(tmp,a+1)
        table.insert(buffer,k,sub)
      end
   end
end

--fin de l'essai de recupération du texte

--la fonction setColor, de Spirikoi dans Universal Menu, que j'ai repris, merci beaucoup à lui
function setColor(theColor) -- It's a "Better lua API" script that Spirikoi have modified, in his "Universal Menu", thanks to him
theColor = string.lower(theColor)
platform.gc():setColorRGB(0,0,0) -- set black as default is nothing else valid is found
if theColor == "blue" then platform.gc():setColorRGB(0,0,255)
elseif theColor == "brown" then platform.gc():setColorRGB(165,42,42)
elseif theColor == "cyan" then platform.gc():setColorRGB(0,255,255)
elseif theColor == "darkblue" then platform.gc():setColorRGB(0,0,139)
elseif theColor == "darkred" then platform.gc():setColorRGB(139,0,0)
elseif theColor == "fuchsia" then platform.gc():setColorRGB(255,0,255)
elseif theColor == "gold" then platform.gc():setColorRGB(255,215,0)
elseif theColor == "gray" or theColor == "grey" then platform.gc():setColorRGB(127,127,127)
elseif theColor == "green" then platform.gc():setColorRGB(0,128,0)
elseif theColor == "lightblue" then platform.gc():setColorRGB(173,216,230)
elseif theColor == "lightgreen" then platform.gc():setColorRGB(144,238,144)
elseif theColor == "magenta" then platform.gc():setColorRGB(255,0,255)
elseif theColor == "maroon" then platform.gc():setColorRGB(128,0,0)
elseif theColor == "navyblue" then platform.gc():setColorRGB(159,175,223)
elseif theColor == "orange" then platform.gc():setColorRGB(255,165,0)
elseif theColor == "palegreen" then platform.gc():setColorRGB(152,251,152)
elseif theColor == "pink" then platform.gc():setColorRGB(255,192,203)
elseif theColor == "purple" then platform.gc():setColorRGB(128,0,128)
elseif theColor == "red" then platform.gc():setColorRGB(255,0,0)
elseif theColor == "royalblue" then platform.gc():setColorRGB(65,105,225)
elseif theColor == "salmon" then platform.gc():setColorRGB(250,128,114)
elseif theColor == "seagreen" then platform.gc():setColorRGB(46,139,87)
elseif theColor == "silver" then platform.gc():setColorRGB(192,192,192)
elseif theColor == "turquoise" then platform.gc():setColorRGB(64,224,208)
elseif theColor == "violet" then platform.gc():setColorRGB(238,130,238)
elseif theColor == "white" then platform.gc():setColorRGB(255,255,255)
elseif theColor == "yellow" then platform.gc():setColorRGB(255,255,0)
  end
end

function on.charIn(ch) --la fonction d'entrée de caractère
  prex = string.sub(buffer[y],0,x)
  postx = string.sub(buffer[y],x+1)
  buffer[y] = prex..ch..postx --on insère le caractère à l'endroit du curseur
  x=x+1 -- pos. caractère suivant
   platform.window:invalidate()
end

function on.paint(gc)
  prex = string.sub(buffer[y],0,x)
  postx = string.sub(buffer[y],x+1)
  width=(13+(math.floor(math.log10(y))+1)*8) --c'est la longueur en pixels du début de la ligne, composé du numéro de la ligne, d'un point et de deux espaces
  i=i-j --i: var de la ligne de debut d'ecriture
  l=table.getn(buffer)

--un écran fait 14 lignes

  if y>i+14 then --[[si le curseur sort de l'ecran par le bas]]
    i=i+1
  end
  if y<i+1 then  --[[ i+1 car on commence avec i=0, si curseur sort de l'ecran par le haut]]
    i=i-1
  end
  j=0    -- c'est un compteur
  k=0    -- c'est un compteur aussi
  m=0    --
  z=0
while i<l do
  i=i+1
  j=j+1
chainy=i..".  "..buffer[i]
if i==y then   j2=j end   
if gc:getStringWidth(chainy)>289 then -- si la chaine dépasse l'écran
  if i==y then
sub=string.sub(chainy,0,x+math.floor(math.log10(y))+1+2) --x+caract. pretapes (n° ligne+2 espaces)
    if gc:getStringWidth(sub)>289 then
      z=289-gc:getStringWidth(sub)  -- on définit z comme le point de départ de la chaine, z est négatif, la ligne se décale
    else
      z=0
    end
  else
    z=0
  end
end
gc:drawString(chainy,z,j*15)  -- j*15: l'ordonnée de la chaine
--coloration syntaxique
e=1
a=1
t=1
longtable=table.getn(cs)
while t<=table.getn(cs) do
  e,a=0,1
  while not(a==nil) do
  a,b=string.find(chainy,cs[t],e)
  if not(a==nil) then
m=gc:getStringWidth(string.sub(chainy,0,a-1))
    setColor(color[t])
   gc:drawString(string.sub(chainy,a,b),m+z,j*15)
    setColor("black")
    end
  e=e+1
end
t=t+1
end

end
--curseur fantome
  sub2=string.sub(buffer[y],0,x)
  lsub2=gc:getStringWidth(sub2)+ gc:getStringWidth(i..". ")
  if lsub2>292 then lsub2=292 end
  gc:drawString("|",lsub2,j2*15)
--ascenceur
  gc:drawString("#",305,((201*(y-1))/l)+15)
  -- cadre de l'ascenseur 
  gc:setPen("medium", "smooth")
  gc:drawLine(304, 0, 304, ((201*(l-1))/l)+10)
  gc:drawLine(303, ((201*(l-1))/l)+12,320,((201*(l-1))/l)+12)
  --[[gc:drawString(x,10,200) --pos x]]     -- débugage par affichage de varaibles à l'écran
  --[[gc:drawString(y,300,200) -- pos y]]
  --[[gc:drawString(width,150,200)]]
end
function on.backspaceKey()  -- la touche del
  if x==0 and y>1 then
  buffer[y-1]=buffer[y-1]..buffer[y]
  x=#buffer[y]
  table.remove(buffer,y)
  y=y-1
  elseif x>0 then 
buffer[y]=string.sub(buffer[y],0,x-1)..string.sub(buffer[y],x+1)
  x=x-1
  end
platform.window:invalidate()
end

function on.enterKey()   -- la touche entrée
  prex = string.sub(buffer[y],0,x)
  postx = string.sub(buffer[y],x+1)
  table.insert(buffer, y+1, postx)
  k=0
while k<100 do    --test de la tabulation
tabul=string.sub(buffer[y],0,k)
g=0
tabulcomp="" 
  while g<k do
    g=g+1
    tabulcomp=tabulcomp.." "
  end
if not(tabul==tabulcomp) then
  tabul=string.sub(tabulcomp,0,k-1)  -- tabul=nombre d'espace de la ligne précédente pour appliquer la tabulation
  k=200
end
k=k+1
end

  buffer[y]=prex
  buffer[y+1]=tabul..buffer[y+1]
  x=#tabul
  y=y+1
  platform.window:invalidate()
end

function on.arrowUp()
  if y>1  then
    y=y-1
  if #buffer[y+1]>#buffer[y] then
   x=#buffer[y]
  end 
    platform.window:invalidate()
  end
end

function on.arrowDown()
  if (table.getn(buffer))>y then
    y=y+1   
  if #buffer[y-1]>#buffer[y] then
   x=#buffer[y]
  end 
    platform.window:invalidate()
  end
end

function on.arrowLeft()
  if x>0  then
    x=x-1
   elseif y>1 then
    y=y-1
    x=#buffer[y]
   end
platform.window:invalidate() 
end

function on.arrowRight()
  if x<#buffer[y] then
    x=x+1
   else  if not(buffer[y+1]==nil) then
   x=0
   y=y+1
  end
end
platform.window:invalidate()
end

function on.mouseDown(mx,my)    -- position du curseur fantôme par clic souris
  width=(13+(math.floor(math.log10(y))+1)*8)
  length=platform.gc():getStringWidth(buffer[y])
  a=i-j
  b=math.floor(a + (my/15))+1
  if b<=table.getn(buffer) then
  y= b -- +1 parce que ca arrondit ( avec math.floor) 1 ligne en dessous
end
k=0
b=true
mx=mx-width
while k<=#buffer[y] and b do
sub=string.sub(buffer[y],0,k)
a= platform.gc():getStringWidth(sub)
if a+z >=mx then
-- "-z":= si la fenetre est decalee (si elle n'est pas décalée, z=0)
x=k
b=false
end
k=k+1
end
 
  platform.window:invalidate()
end
Last edited by yatto on 06 Nov 2011, 12:42, edited 5 times in total.
User avatar
yattoPremium
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 11.7%
 
Posts: 104
Images: 1
Joined: 05 Oct 2011, 12:46
Location: IDF
Gender: Male
Calculator(s):
MyCalcs profile
Class: ENS Rennes - Mécatronique (1A)

Re: Lua et UTF-8 ?

Unread postby Excale » 12 Oct 2011, 19:52

yatto wrote:Heu, rien à voir avec mon premier problème, mais si vous avez une idée de comment faire pour récupérer le texte tapé avant la fermeture du programme et le réafficher à l'ouverture après, ce serait chouette, parce que je n'en mène pas large, moi.


Tu peux enregistrer des données dans des variables du classeur.
Il faut peut-être que l'utilisateur enregistre le classeur pour pouvoir retrouver son texte le jour où il ré-ouvrira le classeur par contre.
Regarde ici: http://wiki.inspired-lua.org/var
User avatar
ExcaleAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 3.9%
 
Posts: 2955
Images: 3
Joined: 10 Sep 2010, 00:00
Gender: Male
Calculator(s):
MyCalcs profile

Re: Lua et UTF-8 ?

Unread postby Levak » 12 Oct 2011, 21:30

Le problème des caractères spéciaux est récurent dans le binding Lua de la TI-Nspire. C'est connu, et normal/compréhensible lorsqu'on s'intéresse à la manière dont est stocké le script dans le fichier tns ... il est sérialisé (c'est à dire traduit de manière à être enregistré et pouvant être retraduit dans l'autre sens, sans interférer avec la structure XML - pour faire court : les balises XML). Cette sérialisation a un coup. TI Nspire Preliminary Scripting Tool ne le fait pas, Luna le fait partiellement, d'autres scripts avant l'apparition de l'OS 3.0.2 le faisaient mieux, mais aucun ne peut prendre en charge tous les caractères sans se montrer exhaustif et lourd à la génération. C'est pourquoi on utilise l'instruction string.uchar() qui renvoie à partir d'un numéro de caractère dans la table de caractères (voir ord("c") en TI Basic Nspire par exemple) en un caractère de cette table.

Cela est utile pour des cas discrets et n'est évidemment pas la bonne manière si tout le script est comme ça. Une autre manière consiste à mâcher le travail de l'outil de conversion (ex:Luna) en sérialisant les données, soit dans le code (moche mais compatible pour tout le monde), soit avec un pseudo Makefile (en gros un script qui va passer avant la génération du tns pour sérialiser de manière personnalisée).

Un exemple de sérialisation : remplacer & par &amp;
Mais attention à l'ordre, car > se remplace par &gt; et si on sérialise le & après > on peut avoir des surprises.

Il est donc conseillé d'utiliser string.uchar() quand même.

Il est également à noter que les commentaires Lua ne sont pas épargnés par la procédure.
Sinon, il faut veiller à ce l'éditeur dans lequel tu travailles enregistre dans le format UTF-8. Si tu n'as pas de moyen de vérifier ça, il est presque certain qu'il enregistre en AINSI ou ISO.

Question : pourquoi avoir besoin absolument de ces caractères ? D'ailleurs quels sont-ils ?


Excale wrote:
yatto wrote:Heu, rien à voir avec mon premier problème, mais si vous avez une idée de comment faire pour récupérer le texte tapé avant la fermeture du programme et le réafficher à l'ouverture après, ce serait chouette, parce que je n'en mène pas large, moi.


Tu peux enregistrer des données dans des variables du classeur.
Il faut peut-être que l'utilisateur enregistre le classeur pour pouvoir retrouver son texte le jour où il ré-ouvrira le classeur par contre.
Regarde ici: http://wiki.inspired-lua.org/var


et aussi là : http://www.inspired-lua.org/2011/08/sav ... ssibility/
Responsable design/graphique de TI-Planet
I do not get mad at people, I just want them to learn the way I learnt.
ImageTNOC [topic][DL]
nClock [topic][DL]
HideManager [topic][DL]
ZLock [topic][DL]
Theme Editor [topic][DL]
Mes programmes
User avatar
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 98.9%
 
Posts: 6414
Images: 22
Joined: 27 Nov 2008, 00:00
Location: 0x1AACC355
Gender: Male
Calculator(s):
MyCalcs profile
Class: BAC+5: Epita (ING3)

Re: Lua et UTF-8 ?

Unread postby yatto » 14 Oct 2011, 17:09

Ah, tiens, j'avais pas regardé "var.recallstr(var)" avec "var" une chaîne, ça doit être pour ça que ça ne marchait pas (ma variable s'appelait "txt")

Pour ce qui est des caractères, je me suis dit que ce serait quand même mieux si mon éditeur passait tous les caractères de la calculatrice, mais si c'est pas possible, tant pis. J'utiliserai quand même string.uchar pour un ou deux caractères dont j'ai besoin (et puis, comme ça j'apprendrai à m'en servir ^^)

l'instruction string.uchar() qui renvoie à partir d'un numéro de caractère dans la table de caractères


Comment on trouve le numéro d'un caractère? Dans quelle table? En fait, j'aimerai utiliser (entre autres) un caractère de la Nspire qui fait une flèche pleine vers la gauche (un triangle, en fait), pour signaler la position dans l'ascenceur (dans mon code dans le premier post, c'est un #). Histoire de faire joli, quoi. Et puis je vais peut-être faire ça aussi pour les caractères usuels, genre "é" "à" "è".

Juste une dernière chose: tu me parles du caractère ">", comme quoi il faudrait le sérialiser. Mais apparemment avec OClua il passe très bien. Il ne passe pas avec Luna? (je n'ai pas essayé).

Et je vais vérifier le mode d'encodage de mon éditeur de texte^^


Donc deux questions:
Comment on trouve le numéro d'un caractère? Dans quelle table?
Les caractères comme > < ne passent pas avec Luna?
Merci pour vos réponses rapides=)
User avatar
yattoPremium
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 11.7%
 
Posts: 104
Images: 1
Joined: 05 Oct 2011, 12:46
Location: IDF
Gender: Male
Calculator(s):
MyCalcs profile
Class: ENS Rennes - Mécatronique (1A)

Re: Lua et UTF-8 ?

Unread postby Levak » 14 Oct 2011, 21:35

yatto wrote:Pour ce qui est des caractères, je me suis dit que ce serait quand même mieux si mon éditeur passait tous les caractères de la calculatrice, mais si c'est pas possible, tant pis.

Tu peux utiliser simplement la table de caractères de la Nspire a lieu de gérer quelque chose que tu n'as pas à gérer. En gros, les caractères accentués existent déjà dans la table, voir Ctrl+Catalogue.

l'instruction string.uchar() qui renvoie à partir d'un numéro de caractère dans la table de caractères


Comment on trouve le numéro d'un caractère? Dans quelle table?

C'était juste après ton quote ! utilise ord()

En fait, j'aimerai utiliser (entre autres) un caractère de la Nspire qui fait une flèche pleine vers la gauche (un triangle, en fait), pour signaler la position dans l'ascenceur (dans mon code dans le premier post, c'est un #). Histoire de faire joli, quoi. Et puis je vais peut-être faire ça aussi pour les caractères usuels, genre "é" "à" "è".

Je pense qu'il serait plus judicieux de le faire à la main (avec drawPoly).

Juste une dernière chose: tu me parles du caractère ">", comme quoi il faudrait le sérialiser. Mais apparemment avec OClua il passe très bien. Il ne passe pas avec Luna? (je n'ai pas essayé).

Si justement !
Luna gère > et & car ce sont les seuls vraiment sensibles. Les caractères à sérialiser sont plutôt les caractères spéciaux (du type accents). Mais comme déjà dit il faut vérifier l'encodage de ton éditeur (UTF-8).
Responsable design/graphique de TI-Planet
I do not get mad at people, I just want them to learn the way I learnt.
ImageTNOC [topic][DL]
nClock [topic][DL]
HideManager [topic][DL]
ZLock [topic][DL]
Theme Editor [topic][DL]
Mes programmes
User avatar
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 98.9%
 
Posts: 6414
Images: 22
Joined: 27 Nov 2008, 00:00
Location: 0x1AACC355
Gender: Male
Calculator(s):
MyCalcs profile
Class: BAC+5: Epita (ING3)

Re: [PROJET]LuaCS: l'éditeur du programmeur Lua sur calculat

Unread postby yatto » 20 Oct 2011, 18:36

Quelques questions:
Peut-on récupérer la pression des touches modifiées par CTRL, notamment { } et [ ] ? Si oui, comment?
Peut-on utiliser un caractère spécial pour signifier "n'importe quelle chaîne"? Je m'explique, dans la coloration syntaxique, le programme reconnait des mots pour les colorier. Mais pour un commentaire, il faut colorier -- et tout le reste de la ligne. Alors y a-t-il un caractère de ce genre, ou c'est forcément uen boucle qui tourne jusqu'à trouver "nil" comme caractère?


-------------------------------------------

Pour donner une idée de ma progression dans le code:

* L'éditeur de texte marche.
* Il gère les lignes, le défilement automatique haut-bas, les sauts de ligne, la suppression de ligne/caractère, mais il ne gère pas la sélection de texte. Je n'ai pas encore réfléchi au problème, et ça m'a l'air vachement compliqué à mettre en œuvre. (pour info il affiche 14 lignes par écran, ce qui est plus que l'éditeur fourni qui gère 8-9 lignes en police petite)
* On peut sauvegarder le texte et le restaurer.
* Si la ligne dépasse la taille de l'écran, la ligne se décale. C'est non seulement BEAUCOUP plus simple à programmer que continuer la ligne sur la suivante, mais c'est aussi plus pratique pour numéroter les lignes et ne pas avoir de caractère "saut de ligne" dès qu'on continue sur la ligne d'après, ce qui peut parfois fausser le code (notamment avec les paramètres de fonction, si la parenthèse s'ouvre avant le saut de ligne)
* Les lignes sont numérotées.
* Un ascenseur indique la position dans le fichier, il n'est pas encore utilisable avec la souris.
* On peut positionner le curseur avec la souris.
* J'ai implémenté quelques fonctionnalités particulières pour la programmation:
- Le rappel de l'indentation (les caractères "espace" mis en début de ligne sont rappelés)
- la coloration syntaxique des mots usuels. Le dictionnaire n'est pas encore rempli, mais j'y travaille.
* J'ai également commencé à faire un menu pour ajouter automatiquement des blocs comme "if then" ou "platform.window:invalidate()". Là non plus, la liste est très incomplète mais j'y travaille également. Si vous pouviez me donner la liste des éléments à ajouter dans le menu (pour la coloration syntaxique je reprends les mots-clefs de Lua) ce serait sympa :D:

Ce que je prévois de faire (dans un futur proche ou lointain suivant ma motivation et/ou mon temps):
* sélection du texte (futur lointain)
* intégration directe du code source d'OClua pour exécuter le code directement depuis l'éditeur, mais il y a plusieurs contraintes: il faut qu'ExtendeD soit d'accord, il faut que le programme génère un nouvel onglet, bascule vers cet onglet et y exécute le code. Je ne sais pas faire tout ça. Je verrai donc. (lointain)
* Utilisation de l'ascenseur avec la souris ou avec un mouvement de grabUp/down, mais je ne sais pas si ces fonctions existent et si elles sont utilisables. Et le problème avec la souris, c'est que si le texte dépasse la taille de l'écran, il continue au dessous de l'ascenseur quand on redécale la fenêtre. Donc en cliquant dans l'ascenseur il faudrait spécifier quelle action exécuter: position du curseur sur la ligne ou ascenseur (futur plutôt proche, j'ai une idée de comment faire, même si elle est peu précise)
User avatar
yattoPremium
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 11.7%
 
Posts: 104
Images: 1
Joined: 05 Oct 2011, 12:46
Location: IDF
Gender: Male
Calculator(s):
MyCalcs profile
Class: ENS Rennes - Mécatronique (1A)

Re: [PROJET]LuaCS: l'éditeur du programmeur Lua sur calculat

Unread postby Levak » 20 Oct 2011, 18:52

Attention au double posting ;) (j'ai supprimé le doublons qui visiblement était un édit du premier).

yatto wrote:Quelques questions:
Peut-on récupérer la pression des touches modifiées par CTRL, notamment { } et [ ] ? Si oui, comment?

Oui, le on.charIn renvoie "[]" lorsqu'on appuie sur Ctrl+ ( ou "{}" pour Ctrl+) (ou l'inverse). Attention, il renvoie bien le doublet "[" et "]" dans la même chaine =).

Peut-on utiliser un caractère spécial pour signifier "n'importe quelle chaîne"? Je m'explique, dans la coloration syntaxique, le programme reconnait des mots pour les colorier. Mais pour un commentaire, il faut colorier -- et tout le reste de la ligne. Alors y a-t-il un caractère de ce genre, ou c'est forcément uen boucle qui tourne jusqu'à trouver "nil" comme caractère?

Ça s'appelle des expressions rationnelles.
En lua je n'ai jamais essayé d'en faire, mais ça devrait se faire comme partout ailleurs dans les fonctions qui supportent les expressions rationnelles (regex) :
"\"[^\"]*\""

Cela est : "" (une chaine vide en double quote)
\" pour échapper le début du quote.
[^\"] pour dire << tout caractère autre que \" >>
* répéter 0 ou n fois (non fixe) le caractère précédent.
\" pour échapper la fin du quote.

Donc là ça devrait (pas testé) capturer toutes les chaines de caractères de quelque format qu'elles puissent être. Quand je dis "capturer" c'est au choix de la fonction utilisée : renvoyer le premier indice, dernier indice, remplacer la séquence, supprimer la séquence etc ...

Pour donner une idée de ma progression dans le code:
...


Bien !
Un petit screen ? :D
Responsable design/graphique de TI-Planet
I do not get mad at people, I just want them to learn the way I learnt.
ImageTNOC [topic][DL]
nClock [topic][DL]
HideManager [topic][DL]
ZLock [topic][DL]
Theme Editor [topic][DL]
Mes programmes
User avatar
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 98.9%
 
Posts: 6414
Images: 22
Joined: 27 Nov 2008, 00:00
Location: 0x1AACC355
Gender: Male
Calculator(s):
MyCalcs profile
Class: BAC+5: Epita (ING3)

Re: [PROJET]LuaCS: l'éditeur du programmeur Lua sur calculat

Unread postby yatto » 21 Oct 2011, 16:38

En fait, je posais la question, justement parce que la calculatrice ne récupère pas la chaîne [] ou {} !!! Et je ne comprends pas pourquoi, en plus ! Même si j'ai une hypothèse: autant pour " Lua récupère, car c'est un seul caractère, autant pour [] {} ou encore := c'est un ensemble de caractères, et peut-être que on.charIn n'est pas appelé quand plusieurs caractères rentrent.

Sinon, j'ai un autre petit problème, spécifique à Luna, apparemment... c'est à propos du curseur "fantôme".

Code: Select all
sub2=string.sub(buffer[y],0,x)
  lsub2=gc:getStringWidth(sub2)+ gc:getStringWidth(i..". ")
  if lsub2>292 then lsub2=292 end
  gc:drawString("|",lsub2,j2*15)


La deuxième ligne est censée donner la longueur de la chaîne en pixels. Avec OClua, tout se passe très bien. Mais avec Luna, le curseur est décalé de quelques pixels sur la gauche. En rajoutant "+2" (pixels) à la ligne 2, avec Luna ça marche. Vous avez une idée d'où viendrait ce petit détail?

--------------------------
Voici un screenshot de LuaCS-Alpha (même pas Beta)
Image

(j'ai écrit un code complètement fictif, hein, ce qui me passait par la tête)



Et voici le code source, annoté (un peu, moins que celui d'avant, j'ai du recommencer avec une copie non-annotée)

Je n'ai pas encore fait de truc bien fichu pour sauvegarder, je pense que je vais intégrer la sauvegarde/la copie entière (voire l'exécution si j'ai le courage, la force, et la permission d'intégrer OClua dans LuaCS)

Code: Select all
--[[LuaCS, de Yatto]]
--[[LuaColorationSytaxique, ou LuaCodeSource]]
--[[compilé avec Luna-0.2a, de ExtendeD
        http://ndlessly.wordpress.com]]
--[[Utilise un bout de Universal Menu, de Spirikoi]]
local x,y
y=1
z=0
i=0
j=0
x=0
recup = false
buffer = {
      [1]="",
              }
cs={  [1]="function",
         [2]="do",
         [3]="if ",
         [4]="then",
         [5]="end",
         [6]="while",
         [7]="=",
         [8]="else" ,
         [9]="elseif",
         [10]="true",
         [11]="false",
         [12]="for ",
         [13]=" do",
         [14]="return",
         [15]="nil",
         [16]="platform.window:invalidate()",
}
color={  [1]="orange",
         [2]="darkred",
         [3]="blue",
         [4]="blue",
         [5]="green",
         [6]="darkred",
         [7]="brown",
         [8]="blue",
         [9]="blue",
         [10]="gray",
         [11]="gray",
         [12]="darkred",
         [13]="darkred",
         [14]="purple",
         [15]="gray",
         [16]="darkblue",
         }


function setColor(theColor) -- It's a "Better lua API" script that Spirikoi have modified, in his "Universal Menu", thanks to him
theColor = string.lower(theColor)
platform.gc():setColorRGB(0,0,0) -- set black as default is nothing else valid is found
if theColor == "blue" then platform.gc():setColorRGB(0,0,255)
elseif theColor == "brown" then platform.gc():setColorRGB(165,42,42)
elseif theColor == "cyan" then platform.gc():setColorRGB(0,255,255)
elseif theColor == "darkblue" then platform.gc():setColorRGB(0,0,139)
elseif theColor == "darkred" then platform.gc():setColorRGB(139,0,0)
elseif theColor == "fuchsia" then platform.gc():setColorRGB(255,0,255)
elseif theColor == "gold" then platform.gc():setColorRGB(255,215,0)
elseif theColor == "gray" or theColor == "grey" then platform.gc():setColorRGB(127,127,127)
elseif theColor == "green" then platform.gc():setColorRGB(0,128,0)
elseif theColor == "lightblue" then platform.gc():setColorRGB(173,216,230)
elseif theColor == "lightgreen" then platform.gc():setColorRGB(144,238,144)
elseif theColor == "magenta" then platform.gc():setColorRGB(255,0,255)
elseif theColor == "maroon" then platform.gc():setColorRGB(128,0,0)
elseif theColor == "navyblue" then platform.gc():setColorRGB(159,175,223)
elseif theColor == "orange" then platform.gc():setColorRGB(255,165,0)
elseif theColor == "palegreen" then platform.gc():setColorRGB(152,251,152)
elseif theColor == "pink" then platform.gc():setColorRGB(255,192,203)
elseif theColor == "purple" then platform.gc():setColorRGB(128,0,128)
elseif theColor == "red" then platform.gc():setColorRGB(255,0,0)
elseif theColor == "royalblue" then platform.gc():setColorRGB(65,105,225)
elseif theColor == "salmon" then platform.gc():setColorRGB(250,128,114)
elseif theColor == "seagreen" then platform.gc():setColorRGB(46,139,87)
elseif theColor == "silver" then platform.gc():setColorRGB(192,192,192)
elseif theColor == "turquoise" then platform.gc():setColorRGB(64,224,208)
elseif theColor == "violet" then platform.gc():setColorRGB(238,130,238)
elseif theColor == "white" then platform.gc():setColorRGB(255,255,255)
elseif theColor == "yellow" then platform.gc():setColorRGB(255,255,0)
  end
end

function on.charIn(ch)
  prex = string.sub(buffer[y],0,x)
  postx = string.sub(buffer[y],x+1)
  buffer[y] = prex..ch..postx --insert char
  x=x+1 -- pos. char suivant
   platform.window:invalidate()
end

function on.paint(gc)
  prex = string.sub(buffer[y],0,x)
  postx = string.sub(buffer[y],x+1)
  width=(13+(math.floor(math.log10(y))+1)*8)
  i=i-j --i: var de la ligne de debut d'ecriture
  l=table.getn(buffer)
  if y>i+14 then --[[si le curseur sort de l'ecran par le bas]]
    i=i+1
  end
  if y<i+1 then  --[[ i+1 car on commence avec i=0, si curseur sort de l'ecran par le haut]]
    i=i-1
  end
  j=0
  k=0
  m=0
  z=0
while i<l do
  i=i+1     -- d'où l'intéret de commencer avec i=0, j'aurais pu changer un peu le code pour commencer a i=1 mais ca ne me gene pas de commencer a 0.
  j=j+1
chainy=i..".  "..buffer[i]  -- on affiche avec la ligne le numérotage
if i==y then   j2=j end     -- j2 sera réutilisé plus tard...
if gc:getStringWidth(chainy)>289 then   -- si la chaine depasse l'ecran
  if i==y then
sub=string.sub(chainy,0,x+math.floor(math.log10(y))+1+2)
--[[ la ligne ci-dessus est un peu bizarre, mais logique au fond.
On veut trouver la longueur de la ligne avec les caractère prétapés: le numéro de la ligne et les deux espaces.
Or le numéro de ligne change! si la ligne est dans les dizaines, elle a deux chiffres, dans les centaines, trois...
D'où l'arrondi du logarithme: il permet de récupérer 0 s'il n'y a qu'une unité, 1 s'il y a des dizaines, 2 avec les centaines...
On rajoute à cela "+1" pour avoir le nombre correct (1 pour unité, 2 pour dizaines...)
et on rajoute enfin "+2" qui correspondent aux deux espaces entre le numéro et la ligne proprement dite.
Ainsi on peut

  ]]
   
    if gc:getStringWidth(sub)>289 then
      z=289-gc:getStringWidth(sub)
    else
      z=0
    end
  else
    z=0
  end
end
gc:drawString(chainy,z,j*15)
--coloration syntaxique
e=1
a=1
t=1
longtable=table.getn(cs)
while t<=table.getn(cs) do
  e,a=0,1
  while not(a==nil) do
  a,b=string.find(chainy,cs[t],e)
  if not(a==nil) then
    m=gc:getStringWidth(string.sub(chainy,0,a-1))
    setColor(color[t])
    gc:drawString(string.sub(chainy,a,b),m+z,j*15)
    setColor("black")
  end
  e=e+1
end
t=t+1
end

end
--curseur fantome, fantome car il n'est pas un caractère dans la chaîne comme je l'avais fait avant. c'est une surimpression.
  sub2=string.sub(buffer[y],0,x)
  lsub2=gc:getStringWidth(sub2)+ gc:getStringWidth(i..". ")
  if lsub2>292 then lsub2=292 end
  gc:drawString("|",lsub2,j2*15)
--ascenceur
  gc:drawString("#",305,((201*(y-1))/l)+15) -- cadre de l'ascenseur
  gc:setPen("medium", "smooth")
  gc:drawLine(304, 0, 304, ((201*(l-1))/l)+10)
  gc:drawLine(303, ((201*(l-1))/l)+12,320,((201*(l-1))/l)+12)
  --[[gc:drawString(x,10,200) --pos x]]
  --[[gc:drawString(y,300,200) -- pos y]]
  --[[gc:drawString(width,150,200)]]
end
function on.backspaceKey()
  if x==0 and y>1 then
  buffer[y-1]=buffer[y-1]..buffer[y]
  x=#buffer[y-1]
  table.remove(buffer,y)
  y=y-1
  elseif x>0 then 
buffer[y]=string.sub(buffer[y],0,x-1)..string.sub(buffer[y],x+1)
  x=x-1
  end
platform.window:invalidate()
end
function on.enterKey()
  prex = string.sub(buffer[y],0,x)
  postx = string.sub(buffer[y],x+1)
  table.insert(buffer, y+1, postx)
  k=0
while k<100 do
tabul=string.sub(buffer[y],0,k)
g=0
tabulcomp="" 
  while g<k do
    g=g+1
    tabulcomp=tabulcomp.." "
  end
if not(tabul==tabulcomp) then
  tabul=string.sub(tabulcomp,0,k-1)
  k=200
end
k=k+1
end
  buffer[y]=prex
  buffer[y+1]=tabul..buffer[y+1]
  x=#tabul
  y=y+1
  platform.window:invalidate()
end

function on.arrowUp()
  if y>1  then
    y=y-1
  if #buffer[y+1]>#buffer[y] then
   x=#buffer[y]
  end 
    platform.window:invalidate()
  end
end

function on.arrowDown()
  if (table.getn(buffer))>y then
    y=y+1   
  if #buffer[y-1]>#buffer[y] then
   x=#buffer[y]
  end 
    platform.window:invalidate()
  end
end

function on.arrowLeft()
  if x>0  then
    x=x-1
   elseif y>1 then
    y=y-1
    x=#buffer[y]
   end
platform.window:invalidate() 
end

function on.arrowRight()
  if x<#buffer[y] then
    x=x+1
   else  if not(buffer[y+1]==nil) then
   x=0
   y=y+1
  end
end
platform.window:invalidate()
end

function on.mouseDown(mx,my)
  width=(13+(math.floor(math.log10(y))+1)*8)
  length=platform.gc():getStringWidth(buffer[y])
  a=i-j
  b=math.floor(a + (my/15))+1
  if b<=table.getn(buffer) then
  y= b -- +1 parce que ca arrondit (math.floor) 1 ligne en dessous
end
k=0
b=true
mx=mx-width
while k<=#buffer[y] and b do
sub=string.sub(buffer[y],0,k)
a= platform.gc():getStringWidth(sub)
if a+z >=mx then
-- "-z":= si la fenetre est decalee
x=k
b=false
end
k=k+1
end
 
  platform.window:invalidate()
end


function on.clearKey()
Rappel()
end

function on.tabKey()
tmp=table.concat(buffer,"/^/")
  tmp = tmp.."/^/" 
  var.store("txt",tmp)
end
                             
function Rappel()
dummy=0
copie=var.recallstr("txt")

tmp=string.sub(copie,2,(#copie)-1) -- enleve les""
temp="" 

  k=1
  tablelongueur=table.getn(buffer) -- il faut définir la longueur en tant que variable pour ne pas que dans la condition la valeur bouge
while buffer[k]~=nil do    -- on teste s'il reste une ou des lignes à supprimer
  table.remove(buffer,k)   -- il va toujours supprimer la ligne 1, et la ligne d'après deviendra la ligne 1
end
-- le buffer est vide, et n'a aucune ligne
table.insert(buffer,1,"")
-- le buffer a une ligne vide
k=0
a=0
  while not(a==nil) do
     k=k+1
     a=string.find(tmp,"/^/")
    if a~=nil then
        table.insert(buffer,k,string.sub(tmp,0,a-1))         
        tmp=string.sub(tmp,a+3)
        --tmp=temp
       end
   end
  platform.window:invalidate()
 
 
  -- le buffer est rempli par la sauvegarde, mais il a une ligne vide à la fin, qu'on va supprimer
  table.remove(buffer, table.getn(buffer))
 
var.store("tmp",tmp)
  x,y=0,1
end

function ecrire(mot,h)
  prex = string.sub(buffer[y],0,x)
  postx = string.sub(buffer[y],x+1)
  buffer[y]=prex..mot..postx
  x = x + h -- on positionne le curseur là où on veut dans l'expression qu'on a rajouté
  platform.window:invalidate()
end

function fIfThen()
ecrire("if  then", 3)
end
function fElse()
ecrire("else", 5)
end
function fEnd()
ecrire("end", 3)
end
function fWhileDo()
ecrire("while do",6)
end
function fForDo()
ecrire("for do", 4)
end
function fPWI()
ecrire("platform.window:invalidate()",28)
end
function fVarMonit()
ecrire("var.monitor()", 12)
end
function fVarUnmonit()
ecrire("var.unmonitor()", 14)
end
function fVarRecall()
ecrire("var.recall()", 11)
end
function fVarRecallstr()
ecrire("var.recallstr()", 14)
end
function fVarStore()
ecrire("var.store(,)",10)
end
function fVarList()
ecrire("var.list()",9)
end
function fFunction()
ecrire("function",8)
end
function fReturn()
ecrire("return",6)
end
function fAccol()
ecrire("{}",1)
end
function fBrackets()
ecrire("[]",1)
end


menu = {
  {"Blocs conditionnels/boucles",
               {"if then", fIfThen},
               {"else", fElse},
               {"end", fEnd},
               {"while do", fWhileDo},
               {"for do", fForDo},
    },
   {"fonction/termes usuels",
               {"function", fFunction},
               {"return", fReturn},
               {"platform.window:invalidate()", fPWI},
   },
   {"Var. -->",
                {"var.monitor()", fVarMonit},
                {"var.unmonitor()", fVarUnmonit},
                {"var.recall()", fVarRecall},
                {"var.recallstr()", fVarRecallstr},
                {"var.store()", fVarStore},
                {"var.list()", fVarList},
   },
   {"Caractères sp"..string.uchar(233).."ciaux", -- un caprice de ma part pour avoir un accent.
                {"{}", fAccol},
                {"[]", fBrackets},
   }
   
   }

toolpalette.register(menu)
User avatar
yattoPremium
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 11.7%
 
Posts: 104
Images: 1
Joined: 05 Oct 2011, 12:46
Location: IDF
Gender: Male
Calculator(s):
MyCalcs profile
Class: ENS Rennes - Mécatronique (1A)

Re: [PROJET]LuaCS: l'éditeur du programmeur Lua sur calculat

Unread postby AlexRider38 » 21 Oct 2011, 19:25

un .tns pour ceux qui n'ont pas l'opportunité de pouvoir compiler en .tns
Donald Knuth wrote:
Beware of bugs in the above code; I have only proved it correct, not tried it.
User avatar
AlexRider38Généreux
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 68.5%
 
Posts: 650
Images: 0
Joined: 03 Nov 2010, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile

Re: [PROJET]LuaCS: l'éditeur du programmeur Lua sur calculat

Unread postby Excale » 21 Oct 2011, 19:28

J'ai essayé de le compiler avec luna (avec un fichier en iso et un autre en utf-8), et mon logiciel PC ne le lit pas.
User avatar
ExcaleAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 3.9%
 
Posts: 2955
Images: 3
Joined: 10 Sep 2010, 00:00
Gender: Male
Calculator(s):
MyCalcs profile

Next

Return to Nspire-Lua

Who is online

Users browsing this forum: No registered users and 7 guests

-
Search
-
Social TI-Planet
-
Featured topics
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Offre de test des nouveautés de rentrée 2024 par Casio. Enseignant(e), reçois gratuitement 1 exemplaire, à ton choix, de la Graph Light ou bien de la Graph Math+
14€ remboursés par Casio sur l'achat de ta calculatrice Graph 35 d'ici le 31 Octobre 2024
10€ remboursés par Casio sur l'achat de ta calculatrice Graph 90+E d'ici le 31 Décembre 2024
10€ remboursés par Casio sur l'achat de ta calculatrice Graph 25 d'ici le 31 Décembre 2024
8€ remboursés par Casio sur l'achat de ta calculatrice Graph Math+ d'ici le 31 Octobre 2024
Reprise de ton ancienne fx-92 Collège ou Graph 25/35/90 à 3€ peu importe son état. Même non fonctionnelle et donc invendable, même ancienne Graph 35 non conforme aux programmes (pas de Python), même ancienne Graph 25/35 inutilisable aux examens (pas de mode examen) et donc invendable. Etiquette de retour fournie, pas de frais de port à payer.
3€ remboursés par Casio sur l'achat de ta calculatrice fx-92 Collège d'ici le 30 Septembre 2024
5€ de remise immédiate sur l'achat de ta calculatrice TI-83 Premium CE Edition Python chez les revendeurs partenaires
4€ de remise immédiate sur l'achat de ta calculatrice TI-82 Advanced Edition Python chez les revendeurs partenaires
3€ de remise immédiate sur l'achat de ta calculatrice TI-82 Advanced chez les revendeurs partenaires
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234567891011121314
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1272 utilisateurs:
>1255 invités
>11 membres
>6 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)