Archive for the '16882' Category

Acquarella Syntax Highlighter

Friday, March 16th, 2012

En el pasado fin de semana, encaré un “code kata” que necesitaba escribir. Estuve programando un “syntax highlighter” simple y configurable, en C#, llamado Acquarella. Pueden ver la historia, avance y resultado en:

https://github.com/ajlopez/Acquarella

La actual solución tiene una librería de clases, un programa de consola, y proyecto de tests:

La idea es tener una librería que podamos referenciar y usar desde nuestros proyectos, en caso que necesitemos algo de “syntax higlighting”, por ejemplo, en un convertidor de Markdown a HTML a la GitHub. La librería toma un texto (un string) e indicando el lenguaje de programación que contiene y el estilo que queremos darle, lo transforma en otro string, usando archivos de configuración. Hay algo más detalle en el README.md.

Practicando “Dog fooding”, el Token.cs transformado por Acquarella:

namespace Acquarella.Lexers
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    public class Token
    {
        private string text;
        private int start;
        private int length;
        private TokenType type;

        public Token(TokenType type, string text, int start, int length)
        {
            this.type = type;
            this.text = text;
            this.start = start;
            this.length = length;
        }

        public string Value
        {
            get
            {
                return this.text.Substring(this.start, this.length);
            }
        }

        public TokenType Type { get { return this.type; } }

        public int Start { get { return this.start; } }

        public int Length { get { return this.length; } }
    }
}

Lindo! 🙂

Trabajo pendiente: reconocer comentarios, números, algunos tipos de palabras adicionales (tengo que revisar otras implementaciones, GitHub distingue entre nombres, variables de instancias (si las reconoce en Ruby comenzando en @) y más), más estilos, y permitir extender el Lexer por código, si no basta la configuración.

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez