Ver mensagens sem resposta | Ver tópicos ativos Hoje é 13 Nov 2019, 14:24



Responder Tópico  [ 1 Mensagem ] 
 Destaque de Sintaxe 
Autor Mensagem
Google employee
Google employee

Data de registro: 01 Jul 2013, 13:45
Mensagens: 2735
Localização: Rio de Janeiro
Mensagem Destaque de Sintaxe
Pra quem trabalha com programação, sabe como esse recurso pode ser muito útil pra manter uma melhor visualização do código. Procurando na internet achei nuita coisa complicada, excesso de código desnecessário, vi que esse é um assunto não muito esclarecido e quem sabe como fazer guarda pra si mesmo (pelo menos é o que eu acho). Então pra acabar com o problema de quem precisa implementar isso em um editor de texto, criei meu próprio EditText com destaque de sintaxe pra mostrar aqui no Portal Android. Ele reconhece apenas a linguagem Java, mas você pode usar qualquer uma.
Usei expressões regulares, um recurso muito bom pra procurar algum padrão de texto. Todo o código já está comentado naquilo que eu achei neccessário. Primeiro a classe Palavras, onde ficaram as expressões regulares que iremos usar:


package jefferson.sintaxe.java;

public final class Palavras extends Object {
    // expressão regular para encontrar as palavras chaves do Java
    public static final String CHAVES =
        "\\b(abstract|assert|break|case|catch|class|const|continue|default|do|" +
        "else|extends|final|finally|for|goto|if|implements|import|instanceof|" +
        "interface|native|new|package|private|protected|public|return|static|strictfp|" +
        "super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\\b";
    // expressão regular para encontrar comentários de um linha ( // )
    // ou mais ( /* */ )
    public static final String COMENTARIOS = "//.*|/\\*(.|\\n)*?\\*/";
    // expressão regular para encontrar os literais
    public static final String LITERAIS = "\\b(true|false|null)\\b";
    // expressão regular para encontrar os números
    public static final String NUMEROS = "\\b([0-9]*[.]?[0-9]+)\\b";
    // expressão regular para encontrar os primitivos
    public static final String PRIMITIVOS = "\\b(boolean|byte|char|double|float|int|long|short)\\b";
    // expressão regular para encontrar os símbolos
    public static final String SIMBOLOS = "([\\[\\]\\|{}!-/:-@^])";
    // expressão regular para encontrar uma string
    public static final String STRINGS = "\".*\"";
   
    // cor = roxo/lilás. Tentei uma cor parecida com essa aqui do fórum
    // mas não deu muito certo. Ignorem essa parte, valeu?
    public static final int COR_CHAVES = 0xff8b008b;
    // cor = verde
    public static final int COR_COMENTARIOS = 0xff228b22;
    // cor = vermelho alaranjado ou laranja avermelhado. Você pode escolher
    public static final int COR_LITERAIS = 0xffff6a6a;
    // cor = vermelho
    public static final int COR_NUMEROS = 0xffff6300;
    // cor = azul
    public static final int COR_PRIMITIVOS = 0xff0000ff;
    // cor = verde
    public static final int COR_SIMBOLOS = 0xff228b22;
    // cor = azul
    public static final int COR_STRINGS = 0xff0000ff;
}
 


Usei aqui uma classe separada pra guardar as ERs e suas cores pra evitar excesso de código na classe filha de EditText e por ser bem melhor pra fazer alterações. Agora, a classe que faz a mágica acontecer:


package jefferson.sintaxe.java;

import android.content.Context;
import android.os.Handler;
import android.text.Editable;
import android.text.Spannable;
import android.text.TextWatcher;
import android.text.style.ForegroundColorSpan;
import android.util.AttributeSet;
import android.widget.EditText;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SintaxeJava extends EditText {
    // pega o conteudo
    private Editable texto = getText();
    // Handler usado para controlar as mudanças na tela do usuário
    private Handler handler = new Handler();
    // tempo necessário para que as palavras mudem de cor
    private long tempoDeEspera = 1000;
   
    // pegam as expressões regulares pra achar as chaves
    // definidas na classe Palavras
    private Pattern chaves = Pattern.compile(Palavras.CHAVES);
    private Pattern comentarios = Pattern.compile(Palavras.COMENTARIOS);
    private Pattern literais = Pattern.compile(Palavras.LITERAIS);
    private Pattern numeros = Pattern.compile(Palavras.NUMEROS);
    private Pattern primitivos = Pattern.compile(Palavras.PRIMITIVOS);
    private Pattern simbolos = Pattern.compile(Palavras.SIMBOLOS);
    private Pattern strings = Pattern.compile(Palavras.STRINGS);
   
    // Runnable que vai ficar atualizando a tela
    private Runnable atualizaSintaxe = new Runnable() {
        public void run() {
            setSintaxe(texto);
        }
    };
   
    // procura por uma chave após o texto ser digitado
    private TextWatcher destacaSintaxe = new TextWatcher() {
        public void beforeTextChanged(CharSequence cs, int inicio, int count, int depois) {}
       
        public void onTextChanged(CharSequence cs, int inicio, int antes, int count) {}
       
        public void afterTextChanged(Editable texto) {
            // atualiza a tela após algo ser digitado
            handler.postDelayed(atualizaSintaxe, tempoDeEspera);
        }
    };
   
    // método para colorir a palavra se ela for uma chave
    private void setSintaxe(Editable texto) {
        // retira a cor da palavra se uma das letras é apagada
        ForegroundColorSpan[] cores = texto.getSpans(0, texto.length(), ForegroundColorSpan.class);
        for (int i = cores.length; i-- > 0;) {
            texto.removeSpan(cores[i]);
        }
        // adiciona as cores ao encontrar uma chave
        for (Matcher m = chaves.matcher(texto); m.find();) {
            texto.setSpan(new ForegroundColorSpan(Palavras.COR_CHAVES), m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        // adiciona as cores ao encontrar um comentário
        for (Matcher m = comentarios.matcher(texto); m.find();) {
            texto.setSpan(new ForegroundColorSpan(Palavras.COR_COMENTARIOS), m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        // adiciona as cores ao encontrar um literal
        for (Matcher m = literais.matcher(texto); m.find();) {
            texto.setSpan(new ForegroundColorSpan(Palavras.COR_LITERAIS), m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        // adiciona as cores ao encontrar um número
        for (Matcher m = numeros.matcher(texto); m.find();) {
            texto.setSpan(new ForegroundColorSpan(Palavras.COR_NUMEROS), m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        // adiciona as cores ao encontrar um primitivo
        for (Matcher m = primitivos.matcher(texto); m.find();) {
            texto.setSpan(new ForegroundColorSpan(Palavras.COR_PRIMITIVOS), m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        // adiciona as cores ao encontrar um símbolo
        for (Matcher m = simbolos.matcher(texto); m.find();) {
            texto.setSpan(new ForegroundColorSpan(Palavras.COR_SIMBOLOS), m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        // adiciona as cores ao encontrar uma string
        for (Matcher m = strings.matcher(texto); m.find();) {
            texto.setSpan(new ForegroundColorSpan(Palavras.COR_STRINGS), m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
   
    private void inicia() {
        setHorizontallyScrolling(true);
        addTextChangedListener(destacaSintaxe);
    }
   
    // Construtor da classe
    public SintaxeJava(Context c, AttributeSet a) {
        super(c, a);
        inicia();
    }
}
 


Creio que o código já esteja bem comentado, então agora é só pegar essa classe pelo xml:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

   
    <jefferson.sintaxe.java.SintaxeJava
        android:id="@+id/sintaxe_java"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="left" >

    </jefferson.sintaxe.java.SintaxeJava>
   
</LinearLayout>
 


E pronto, agora você pode criar seu próprio editor de texto com destaque de sintaxe pra qualquer linguagem!
Link do projeto

_________________
Quando seu problema for resolvido, clique na opção Editar no lado superior direito da sua primeira mensagem e coloque [Resolvido] no título.
Se resolveu o problema sozinh@, não esqueça de postar a solução, ela ajuda usuários em buscas no fórum.
Use os marcadores java e xml quando for postar.

Aprenda Java com esta apostila.


23 Fev 2014, 21:35
Perfil WWW
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 1 Mensagem ] 

Quem está online

Usuários vendo este fórum: adelar, Aderbal Nunes, aechiara, agtavares, alexandreufcg, Alexsandro Tirloni, alfredo_ej, Anakin Skywalker, Andre, Androidthebest, Aparec, arkanjo, Ask Jeeves, axellsan, Bass, BOMBER27, BornSlip, brcamp, Bruno, bruno.abd, Brunohc, buccalon, capo, cehills, Chanceler Supremo Finis Valorum, Chefe Nass, christian, comolatti, Corneta, Crazy_Droid, Cynthia, dalmeidabr, Darth Maul, dentimskol, Diego Otani, diegorrborges, dikiloco, dr.faro, du_sr, dudu795, edson dias de gusmao, edsonel, erikopa, estratec, everaldo, Everton Moreira, eXagon, faco, fcoroa, Felipe Ferreira, felipedornelas, Flavio, Flávio Robertgo, fmakula, fredjpa, furlanrapha, Gabriel, gedoor, geovanebg, glmsistemas, Gomes, Gui Pereira, Guilherme Cobain, guilhermepilotti, HanNiBaLSeTDf, hebert, helder, henrique.cardoso, hostdesigner, infonlinebr, jacksaum, Jalerson, Jenius, jgfelix, jijo, jrchuteboxe, jrsilva, juniorsk8, kecyobarros, kennedyximenes, kristopher, lafamac, lanlan, laucode, Legiao, Lelinho, leofernandesmo, Leonardo, Lord, lucastgomes, lufreitas, marcelorferrari, marcelosv, Marco Magoo, marcosf63, marianatallas, marlovich, martins, mcroft, mikasjau, mvoto, n3t0, nirvana, nishimura.ichigo, On_7, otium, pabarbosa, Padawan, paulovaz, peixe, phsantos, pyrobit, rananfu, raninhofernandes, reginaldo, regisjj, rfrafael, ricardo, Roberto, rogeriopgomes, Rogério, rosano, rtodao, Snappy [Bot], srsilveira, Telekom [Bot], tiagocordeiro, tonylock, ttaranto, vandob, vicfalmac, vilmartr, viniciusluiz, weber, Wesleyceraso, wilson.slima, wilsond, wingdoido, wylken, xikin e 1 visitante


Você não pode criar novos tópicos neste fórum
Você não pode responder tópicos neste fórum
Você não pode editar suas mensagens neste fórum
Você não pode excluir suas mensagens neste fórum
Você não pode enviar anexos neste fórum

Procurar por:

© 2007 - 2016 Portal Android - Comunidade de Desenvolvedores Android

Estamos no Linkedin    Siga-nos no twitter


Powered by phpBB - Hospedado por Bemobi