2012-08-16 22 views
20

¿Alguien sabe de librerías de resaltado de sintaxis que funcionan en Android? He visto jsyntaxpane pero eso no parece ser compatible con Android.¿Destaca la sintaxis de Android?

+0

¿Qué quiere resaltar yiu? – Ahmad

+0

por favor, elabore más sobre su pregunta, ¿qué componente desea mostrar resaltando? –

+1

http://code.google.com/p/android-codepad/ –

Respuesta

12

Para resaltar la sintaxis de sólo lectura, tiene dos opciones:

  1. encontrar una biblioteca Java que puede sintaxis resaltado y generar HTML usando <font color=""> (es decir, sin CSS). A continuación, puede usar Html.fromHtml() para crear un objeto Spanned que puede entregar a TextView.

  2. Busque una biblioteca Java que pueda resaltar la sintaxis y generar cualquier tipo de HTML. A continuación, puede visualizarlo en un WebView. Esto parece ser lo que hace the android-codepad project un comentarista vinculado.

Si usted está buscando resaltado de sintaxis para un editor de , que es significativamente más difícil. Mientras que EditText puede tomar el mismo Spanned que TextView puede, debe ejecutar todo a través del resaltador de sintaxis para reflejar los cambios, ya sea por pulsación de tecla o después de una pausa al escribir. O bien, necesitaría hornear las reglas de resaltado de sintaxis mucho más estrictamente para el proceso de edición, para que de alguna manera pueda ajustar incrementalmente el resaltado sin tener que rehacer todo el contenido del EditText. No he visto un editor de resaltado de sintaxis de código abierto para Android, aunque hay algunos de código cerrado como aplicaciones en Play Store.

+0

gracias, lo necesito para un editor. Parece que voy a comenzar a buscar en jsyntaxpane para ver si puedo portarlo a android/edittext. – ng93

+2

@ ng93: ¿Tuvo algún éxito implementando resaltador de sintaxis? En caso afirmativo, ¿puede explicar un proceso de implementación? Gracias de antemano. – rule

+0

¿Ha encontrado alguna biblioteca Java que tenga la magia '' descrita en el 1. punto? – fracz

19

Bueno, lo hice un editor de resaltado de sintaxis de código abierto para Android:

https://github.com/markusfisch/ShaderEditor

Es bastante simple y tal vez sólo es adecuado para los datos pequeños, pero es probable que sea un buen punto de partida.

+1

Muy buen ejemplo. Definitivamente muestra su simplicidad. Fuente de EditText: https://github.com/markusfisch/ShaderEditor/blob/master/src/de/markusfisch/android/shadereditor/ShaderEditor.java – JRomero

+1

@JRomero Link doesn Parece que ya no funciona –

+3

El enlace anterior está roto [aquí hay un nuevo enlace] (https://github.com/markusfisch/ShaderEditor/blob/5af7129d05a1d122923ae78d110a55a09597589f/app/src/main/java/de/markusfisch/android/shadereditor /widget/ShaderEditor.java) –

32

Logré crear un resaltador de sintaxis para Android, basado en el Prettify. Fue fácil, en realidad, cuando encontré el Java Prettify. Simplemente descárguelo (lamentablemente, no está publicado para maven) y agregue su jar a la ruta de compilación de su aplicación.

El resaltador de sintaxis que crea basándose en que:

public class PrettifyHighlighter { 
    private static final Map<String, String> COLORS = buildColorsMap(); 

    private static final String FONT_PATTERN = "<font color=\"#%s\">%s</font>"; 

    private final Parser parser = new PrettifyParser(); 

    public String highlight(String fileExtension, String sourceCode) { 
     StringBuilder highlighted = new StringBuilder(); 
     List<ParseResult> results = parser.parse(fileExtension, sourceCode); 
     for(ParseResult result : results){ 
      String type = result.getStyleKeys().get(0); 
      String content = sourceCode.substring(result.getOffset(), result.getOffset() + result.getLength()); 
      highlighted.append(String.format(FONT_PATTERN, getColor(type), content)); 
     } 
     return highlighted.toString(); 
    } 

    private String getColor(String type){ 
     return COLORS.containsKey(type) ? COLORS.get(type) : COLORS.get("pln"); 
    } 

    private static Map<String, String> buildColorsMap() { 
     Map<String, String> map = new HashMap<>(); 
     map.put("typ", "87cefa"); 
     map.put("kwd", "00ff00"); 
     map.put("lit", "ffff00"); 
     map.put("com", "999999"); 
     map.put("str", "ff4500"); 
     map.put("pun", "eeeeee"); 
     map.put("pln", "ffffff"); 
     return map; 
    } 
} 

Los colores de la sintaxis están codificados, pero pueden ser también establecidos por decir preferencias de la aplicación. Con el fin de mostrar un código fuenteJava en un TextView, acaba de hacer:

// code is a String with source code to highlight 
// myTextView is a TextView component 
PrettifyHighlighter highlighter = new PrettifyHighlighter(); 
String highlighted = highlighter.highlight("java", code); 
myTextView.setText(Html.fromHtml(highlighted)); 

La biblioteca de Java Prettify hizo que mi aplicación alrededor de 50kB más grande.

+0

@wojciech Perfecto y preciso ................ –

+0

@ WojciechFrącz Dude, ¿qué pasa con el código C? esperando la respuesta –

+2

@Tarun, reemplace primero " java "argumento con" c "o" cpp ". – fracz

1

He creado una API para resaltar texto que puede resolver su problema.

https://github.com/nakshay/TextHighlighter

Esta API permite pasar las palabras y los colores específicos a las palabras y devuelve la cadena que está formateado con etiquetas html que se puede enviar a Html.fromHtml() para obtener el texto resaltado. agregue la dependencia de Gradle debajo del archivo gradle de su módulo.

compile 'com.github.akshay-naik:texthighlighterapi:1.1.0' 
+0

Los enlaces a posibles soluciones siempre son bienvenidos, pero por favor agregue algunos detalles para futuros visitantes en caso de que el enlace ya no esté disponible. –

+1

Gracias por su sugerencia Nikolay. agregando más detalles. – Akshay

+0

Lo usé No puedo encontrar esta función highlighter.setLanguage(); –

Cuestiones relacionadas