Ir para conteúdo
  • 0

Simplificar Função


Slicer

Pergunta

Ola galera, cabei de fazer essa funçao aki...

 

function textFormat(txt, sep)
local t1 = string.explode(txt, sep)
local final = {}
local count = 0

if not sep or sep == "" then
  for w in string.gmatch(txt, "[%a!%d@#$%&*)(_-+=%[%]~><.,:;\/?}{^]" ) do
   if count+1 > 30 then
	  w = "\n"..w
	  count = 0
   end
   table.insert(final, w)
   count = count+1
  end
elseif sep == "\n" then
  for i = 1, #t1 do
   local t2 = string.explode(t1[i], " ")
   for _, w in ipairs(t2) do    
	   if (#w+1)+count > 31 then
		  w = "\n"..w
		  count = 0
	   end
	   table.insert(final, w.." ")
	   count = count+#w
   end
   table.insert(final, "\n")
   count = 0
  end  
elseif sep == " " then
  for _, w in ipairs(t1) do
   if (#w+1) + count > 30 then
	  w = "\n"..w
	  count = 0
   end
   table.insert(final, w..sep)
   count = #w+count
  end		  
end
return table.concat(final)
end

 

 

oq ela faz: ela deve limitar o tamanho de uma string ah no maximo 30~31 letras, caso passe disso ela acresenta um '\n' pra fazer o resto da string ir pra proxima linha... eu tive q fazer essa funçao pois no OTClient a janela da funaço doShowTextDialog(...) nao faz essa limitaçao e entao n da pra ver o resto da string caso ela passe dessas 30~31 letras...

 

queria saber se alguem consegue diminuir essa funçao de algum jeito... pois achu q ela pode ta um pouco grande d+ e bem 'pesada'... e tb pra fins de aprendizado...

 

aki um exemplo de test:

 

local txt1 = "OLAPORRAFERROSEILAOQUETOFAZENDOAKI?COISADODEMOO.OHAHA"

local txt2 = "OLA PORRA FERRO SEILA OQUE TO FAZENDO AKI? COISA DO\nDEMO o.O HAHA !!234 $$&&"

local txt3 = "OLA PORRA FERRO SEILA 123 OQUE TO FAZENDO AKI? COISA DO DEMO o.O HAHA !!234 $$&&"

 

doShowTextDialog(cid, 12222, textFormat(txt2, "\n"))

 

Editado por Slicer
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

function text_format(str)

if string.len(str) > 30 then
str = str .. "/n"
end
return str
end


 

function text_format(str, sep)

if string.len(str) > 30 then
str = str .. "" .. sep .. ""
end
return str
end

Ela tá bem simples precisa melhorar, mas funciona k.

Na segunda em sep você escolhe oque quer adicionar no final.

 

Entendi mals e a cada 30 caracteres vou editar aqui.

Editado por Skymagnum
Link para o comentário
Compartilhar em outros sites

  • 0

ah ideia eh um pouco mais complicada q isso...

eh pro script pegar uma string, podendo ser um texto enorme!, dai ela verifica se o texto tem espaços ou '/n' ou n tem nd disso e vai ajeitando ela, colocando novos '\n' a cada 30 caracteres... n eh bem pra pegar soh uma string 'simples' em si...

Editado por Slicer
Link para o comentário
Compartilhar em outros sites

  • 0

function recursive_skipLine(string, maxLength)

if string:len() > maxLength then
	return string:sub(1, maxLength) .. "\n" .. recursive_skipLine(string:sub(maxLength + 1, string:len()), maxLength)
end

return string
end

function iterative_skipLine(string, maxLength)

for n = maxLength, string:len() * (1 + 2/maxLength), maxLength + 2 do
	string = string:sub(1, n) .. "\n" .. string:sub(n + 1, string:len())
end

return string
end

 

uma função recursiva e outra iterativa pra você ver ambas formas de resolver seu probleminha

em questão de tempo de execução, a iterative é ligeiramente mais rápida, só que em questão de memória, a recursiva pesa mais... mas isso só chega a ser um problema se o texto for realmente grande, pode testar com um debugger um código do tipo:

 

local text = ""
for a = 1, 1280 do
   text = text .. "Um texto realmente muito grande! "
end

local time = os.clock()

text = ?????????_skipLine(text, 4)

time = os.clock() - time

print(time, #text)

 

no lugar dos "??????" coloque a se é a função iterative ou recursiva, aí você consegue ver o tempo que cada uma demora pra separar um texto grandinho em 4 em 4...

 

um detalhezinho, não coloque 0 como maxLength que você vai abrir um loop sem fim... no caso do recursivo, aponta stack overflow no final por exigir muito da memória, mas a iterativa rola pra sempre e inclusive trava o servidor.

Editado por brun123
Link para o comentário
Compartilhar em outros sites

  • 0

eh boas funçoes heim brun... soh q tem um problema... as vezes ela corta palavras... ;x oia a img.. \/

 

dexqn.jpg

 

Editado por Slicer
Link para o comentário
Compartilhar em outros sites

  • 0


string.skipline = function(s, l)
       if string.len(s) > l then
               local x = string.sub(s, 1, l)
               local y = string.sub(s, (l + 1), string.len(s))
               if string.len(y) > l then
                       y = string.skipline(y, l)
               end
               s = x .. string.gsub(y, "%s", "\n", 1)
       end
       return s
end

 

Vê se funciona legal aí.

 

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0

eh n ta mais separando letras, mas ainda ta fazendo umas coisas lokas kk e n ta separando uma string soh de 30+ caracteres ;/ imgs \/

 

dex3i.jpg

 

 

dex2i.jpg

 

 

achu q vai ficar a minha ms kk

 

edit: oia como fica com a minha funçao...

 

dex4r.jpg

 

Editado por Slicer
Link para o comentário
Compartilhar em outros sites

  • 0

Se a sua é funcional, não importa o tamanho. Eu fiz a minha meio gambiarra para só quebrar espaços de strings, ou seja uma string gigante de 30 caracteres sem espaços não quebraria.

Editado por Oneshot
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...