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