π
<-
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

Message non lude 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: Tout sélectionner
-- [[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
Dernière édition par yatto le 06 Nov 2011, 12:42, édité 5 fois.
Avatar de l’utilisateur
yattoPremium
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 11.7%
 
Messages: 104
Images: 1
Inscription: 05 Oct 2011, 12:46
Localisation: IDF
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes - Mécatronique (1A)

Re: Lua et UTF-8 ?

Message non lude Excale » 12 Oct 2011, 19:52

yatto a écrit: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
Avatar de l’utilisateur
ExcaleAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 3.9%
 
Messages: 2955
Images: 3
Inscription: 10 Sep 2010, 00:00
Genre: Homme
Calculatrice(s):
MyCalcs profile

Re: Lua et UTF-8 ?

Message non lude 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 a écrit:
yatto a écrit: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
Avatar de l’utilisateur
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 98.9%
 
Messages: 6414
Images: 22
Inscription: 27 Nov 2008, 00:00
Localisation: 0x1AACC355
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: BAC+5: Epita (ING3)

Re: Lua et UTF-8 ?

Message non lude 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=)
Avatar de l’utilisateur
yattoPremium
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 11.7%
 
Messages: 104
Images: 1
Inscription: 05 Oct 2011, 12:46
Localisation: IDF
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes - Mécatronique (1A)

Re: Lua et UTF-8 ?

Message non lude Levak » 14 Oct 2011, 21:35

yatto a écrit: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
Avatar de l’utilisateur
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 98.9%
 
Messages: 6414
Images: 22
Inscription: 27 Nov 2008, 00:00
Localisation: 0x1AACC355
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: BAC+5: Epita (ING3)

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

Message non lude 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)
Avatar de l’utilisateur
yattoPremium
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 11.7%
 
Messages: 104
Images: 1
Inscription: 05 Oct 2011, 12:46
Localisation: IDF
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes - Mécatronique (1A)

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

Message non lude Levak » 20 Oct 2011, 18:52

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

yatto a écrit: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
Avatar de l’utilisateur
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 98.9%
 
Messages: 6414
Images: 22
Inscription: 27 Nov 2008, 00:00
Localisation: 0x1AACC355
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: BAC+5: Epita (ING3)

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

Message non lude 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: Tout sélectionner
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: Tout sélectionner
--[[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)
Avatar de l’utilisateur
yattoPremium
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 11.7%
 
Messages: 104
Images: 1
Inscription: 05 Oct 2011, 12:46
Localisation: IDF
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: ENS Rennes - Mécatronique (1A)

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

Message non lude AlexRider38 » 21 Oct 2011, 19:25

un .tns pour ceux qui n'ont pas l'opportunité de pouvoir compiler en .tns
Donald Knuth a écrit:
Beware of bugs in the above code; I have only proved it correct, not tried it.
Avatar de l’utilisateur
AlexRider38Généreux
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Prochain niv.: 68.5%
 
Messages: 650
Images: 0
Inscription: 03 Nov 2010, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile

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

Message non lude 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.
Avatar de l’utilisateur
ExcaleAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 3.9%
 
Messages: 2955
Images: 3
Inscription: 10 Sep 2010, 00:00
Genre: Homme
Calculatrice(s):
MyCalcs profile

Suivante

Retourner vers Nspire-Lua

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 17 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1538 utilisateurs:
>1523 invités
>11 membres
>4 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)