Tincr: CSS and JAVASCRIPT browser extension

A aquellos de vosotros que, como desarrolladores, os guste tener multitud de plugins en los navegadores que faciliten vuestra labor, aquí os traigo un plugin que ha caido en mis manos y que he encontrado muy interesante.

Se trata de un plugin para editar las características CSS y JAVASCRIPT, directamente desde la consola del navegador Lamentablemente está solo disponible para Chrome, pero espero que algún día lo preparen para el resto de navegadores.

¿Y qué diferencia puede tener respecto a otros plugins similares, como Firebug, EditCSS, Web Developer Toolbar, etc? Pues, en principio, una bastante importante... Es capaz de guardar cada uno de nuestros cambios.

En la mayoria de las ocasiones, tenemos la necesidad de ir modificando multitud de elementos CSS en nuestras páginas, para ir viendo cómo va quedando el resultado final. El problema que nos encontramos entonces, es "pasar" todas las modificaciones realizadas a la página de estilo final.

Es entonces, cuando podemos perder alguna modificación porque no encontremos TODAS las actualizaciones que hemos realizado.

¿Y como viene Tin.cs a solucionar todos estos problemas?
Muy sencillo. Él solito se encarga de almacenar cada cambio que vamos haciendo, directamente en el archivo original del proyecto.

Por fin podemos realizar todos nuestros cambios y, al mismo tiempo que se ven reflejados en la página, se van almacenando en su página .css correspondiente. Ya no tenemos que buscar, copiar y pegar cada modificación que hemos efectuado.

PONIENDO EN MARCHA Tincr:
· INSTALACIÓN: Para poder empezar a utilizar Tincr, debemos descargarnos el plugin para Chrome (disponible aqui).
· CONFIGURACIÓN: Para configurar el plugin, debemos abrir la consola de desarrollador (Ctrl+Shift+i) y pulsar el botón de configuración de Tincr. En la ventana que se nos abre, seleccionamos el tipo de proyecto "Configuration File" y luego, indicamos la ruta a nuestro proyecto.
Sólo nos queda incluir en nuestro proyecto el archivo de configuración en donde le indicamos al plugin qué archivos debe controlar.
· INCLUSIÓN DEL ARCHIVO tincr.json: Dentro de la carpeta del proyecto, debemos incluir el archivo tincr.json (que utiliza el plugin), con el código fuente que indica dónde están nuestros archivos css y js, para que la gestión de los mismos se efectúe correctamente.

Aquí os pongo un ejemplo de cómo sería este archivo:

CÓDIGO JSON DE CONFIGURACIÓN:

{
       "toFile" : [
             {"from": "/js/(.+\\.js)",
              "to": "/js/$1"},
             {"from": "/css/(.+\\.css)",
              "to": "/css/$1"}
       ],
       "fromFile" : [
             {"from": "(\\\\|/)app\\1assets\\1(?:javascripts|stylesheets)\\1(.+(\\.js|\\.css))(\\.[a-zA-Z]+)?$",
              "to": "/assets/$2?body=1"}
       ]
}


Y YA ESTÁ:
Ya podemos empezar a utilizar la consola de desarrollador, y hacer cuantos cambios sean necesarios. Todos y cada uno de ellos, se almacenarán automáticamente en los archivos correspondientes.

Si tenéis abierto el programa con el que normalmente desarrolláis vuestras aplicaciones (Visual Studio en mi caso), podréis rechazar los cambios que el plugin haya realizado, simplemente con regresar a vuestro editor y cancelar el aviso que os indica que el archivo '...ha sido modificado fuera del editor...'.

Espero que os ayude en vuestros desarrollos, y os permita ganar tiempo a la hora de actualizar los diseños de vuestras aplicaciones.

Un saludo a todos!

REFERENCIAS:
Tincr site
Reference Docs
[...]

Leer más >>

Windows 8 Apps: Design Grid Layout Pattern

Ya he comenzado ha desarrollar algunas aplicaciones para el nuevo sistema operativo de Windows 8. Por supuesto, partiendo de toda la documentación de la que disponemos desde el MSDN Microsoft.

Uno de los primeros pasos que debemos seguir, pasa por construir nuestras aplicaciones siguiendo los consejos que nos ofrece. En concreto el diseño de la aplicación y el layout básico de cada elemento que vamos a incluir en nuestras páginas.

En este post, voy a tratar de resumir los conceptos básicos de distribución de elementos en el grid.

Y como a mi me gusta tener las cosas ordenaditas, he tratado de agrupar todas las dimensiones en un único documento. Para ello, he recogido todas las imágenes que MSDN pone a nuestra distribución y las he incluido en una sóla imágen. Así, podemos descargarla e imprimirla para tener toda la información de un sólo vistazo.



Estas son las directrices básicas:

TITULAR Y CONTENIDO
· Margen superior de 45 px para el titular de la aplicación (línea base del texto a 100 px).
· Margen superior del contenido de 140 px.
· Margen izquierdo de la aplicación a 120 px.

ELEMENTOS
· Espacio interno horizontal entre elementos de borde: 10 px.
· Espacio interno horizontal entre elementos de lista: 40 px.
· Espacio interno horizontal entre elementos de bloque/grupos: 80 px.

· Espacio interno vertical entre elementos de borde: 10 px.
· Espacio interno vertical entre elementos: 20 px.

FOOTER
· El margen del pie de la aplicación, puede variar en función de los contenidos, pero nunca debe ser mayor de 130 px ni menor de 50 px.

Aunque aquí están todos los márgenes establecidos en pixels, no está de más saber que se han obtenido a partir de la estructura básica que microsoft considera básica, en la cuadricula de trabajo. Para Windows8, la estructura básica es la unidad (20px), que contiene a su vez 16 subunidades (de 5 px cada una). Aquí os dejo la imágen gráfica que define todos estos conceptos.



Por supuesto, todas las imágenes pertenecen a Microsoft, y aquí lo único que he intentado es unificar y agrupar los conceptos.

Podéis encontrar toda la documentación e imágenes en la siguiente dirección http://msdn.microsoft.com/es-es/library/windows/apps/hh872191.aspx

REFERENCIAS:
MSDN Microsoft
Diseñar una página de aplicación
Tutorial para crear tu primera aplicación Windows 8
[...]

Leer más >>

CODE SNIPPET: Google Traking

Cuando la mayoría de los clientes te pide un proyecto, acaba solicitando también un completo estudio de visitas, páginas vistas, eventos, descargas, ect.

Google ofrece un gran abanico de posibilidades de gestión para dicha información. Si ya tienes una cuenta de Google, podrás acceder a este servicio. Sino, puedes generarte una y empezar a investigar en Google Analytics

En este CODE SNIPPET os voy a pasar un breve código javascript con el que fácilmente podremos incluir nuestras páginas en las estadísticas de Google, sin necesidad de copiar el mismo código en todas nuestras páginas.

Lo primero que debemos hacer es crear un archivo de texto en nuestro proyecto web, y luego, copiar y pegar el siguiente CÓDIGO JAVASCRIPT:

/* GLOBAL CONTROL VARS */
varANALYTICS_KEY = 'XXXXXXXXXXX';
varANALYTICS_DOMAIN = 'mydomain.com';

var_gaq = _gaq || [];
_gaq.push(['_setAccount', ANALYTICS_KEY]);
_gaq.push(['_setDomainName', ANALYTICS_DOMAIN]);
_gaq.push(['_trackPageview']);

/**
* Function to tracking google analitics
*/
(function() {
    var ga = document.createElement('script');
    ga.type = 'text/javascript'; ga.async = true;

    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga, s);

})();

/**
* Function to track events, width params
* @param {String} categoria Category to track.
* @param {String} accion    Event to track.
* @param {String} etiqueta  Label to set what is tracking.
* @param {String} valor     Optional: Aditional tracking data.
* @return {void}
*/
function TrackingLink(category, action, label, val) {
    if (!valor) {
        _gaq.push(['_trackEvent', category, action, label]);
    } else {
        _gaq.push(['_trackEvent', category, action, label, val]);
    }

Para actualizar dicho código en cada proyecto futuro, simplemente deberemos cambiar las variables ANALYTICS_KEY y ANALYTICS_DOMAIN, con los valores reales, y incluir una referencia al archivo js en cada página que deseemos trackear.


REGISTRO DE EVENTOS EN GOOGLE ANALYTICS:

En el código que os incluyo, veréis que existe una función encargada de insertar eventos en Google Analytics. Pues bien, esta función permite insertar y parametrizar, desde cualquier parte de la aplicación, un nuevo evento para su posterior análisis.

Aunque Google tiene bastante información al respecto, simplemente comentar que con esa función podemos controlar desde 'Clicks' hasta 'MouseOver', 'ExternalLinks', ect.

Si por ejemplo quisiéramos controlar el número de descargas realizadas en una página de descargas de nuestra aplicación, simplemente añadiendo el siguiente fragmento a cada enlace, tendríamos un control completo de esa información:

< a href="downloads/poster.zip" onclick="TrackingLink('Descargas'Click', 'Poster');">POSTER</a>
< a href="downloads/libro.zip" onclick="TrackingLink('Descargas', 'Click', 'Libro');">LIBRO</a>
< a href="downloads/juego.zip" onclick="TrackingLink('Descargas', 'Click', 'Game');">GAME</a>

o por ejemplo, el control de los enlaces a redes sociales:

<a href="http://tuenti.com/mituenti" onclick="TrackingLink('Redes', 'Click', 'Tuenti');">MI TUENTI</a>
<a href="http://facebook.com/micuentafacebook" onclick="TrackingLink('Redes', 'Click', 'Facebook');">MI FACEBOOK</a>

Ahora hay que dejar volar la imaginación!

REFERENCIAS:
Google Analytics
Traking Events Google
Cómo realizar un evento

Un saludo a todos.
[...]

Leer más >>

CKEditor.NET: Insert multiple events on instance


En este post vamos a ver cómo podemos incluir eventos en el editor de texto html CKEditor, en su versión de ASP.NET.

Dado que la documentación existente para este complemento es un poco escasa, creo que puede ser un post interesante, maxime cuando no he encontrado muchas referencias en la web, incluso buscando en "San Google".

Para controlar la inserción de nuevos eventos en CKEditor, tenemos la posibilidad de hacerlo vía javascript. El problema surge cuando en vez de utilizar la librería tal cual, y convertir nuestros Textarea a CKEditor, implementamos directamente los controles que ofrece la dll "CKEditor:CKEditorControl".

Tras una árdua búsqueda, y no encontrar nada más que la opción de código <INSTANCE>.config.CKEditorInstanceEventHandler, me encontré con la desagradable sorpresa de que el propio objeto CKEditorInstanceEventHandler sólo almacena el primer evento generado con la lista. Por tanto, si intentamos hacer algo similiar a esto...:

CODIGO ERRÓNEO

<INSTANCE>.config.CKEditorInstanceEventHandler = new System.Collections.Generic.List<object>();

<INSTANCE>.config.CKEditorInstanceEventHandler.Add(new object[] { "instanceReady", "MyInstanceReadyFunction" });

<INSTANCE>.config.CKEditorInstanceEventHandler.Add(new object[] { "paste", "MyPasteFunction" });

...observaremos que el segundo evento no se lanza jamás.

Llegados a este punto,sólo nos queda pensar cómo instanciar todos nuestros eventos, sobre todo cuando el control CKEditor:CKEditorControl lanza exclusivamente el primero.

Sorprendentemente la respuesta no podía ser más sencilla. Puesto que podemos implementar los eventos por javascript, lo único que nos restaría por hacer, es generar una función Javascript que realice ese trabajo, recibiendo como parametro el control a inicializar.

Con este fragmento de código, y modificandolo en funcion de nuestras necesidades, podremos añadir tantos eventos como sea necesario.

CODIGO ASP.NET
<INSTANCE>.config.CKEditorInstanceEventHandler = new System.Collections.Generic.List<object>();
<INSTANCE>.config.CKEditorInstanceEventHandler.Add(new object[] { "instanceReady", "MyInstanceReadyFunction" });

CÓDIGO JAVASCRIPT
/**
* Funcion que inicializa la instancia CKEditor, a partir del evento instanceReady
* @param {Event} Objeto a instanciar
*/
function MyInstanceReadyFunction (evt) {
    var maxLength = 255;
    evt.editor.on('paste', function (e) {
        e.data.html = strip_tags(e.data.html, tagsPermitidas);
        checkLength(e, maxLength);
    });
    evt.editor.on('key', function (e) {
        checkLength(e, maxLength);
    });
}

Concretamente en este ejemplo, la inicialización de eventos incluye:
· 'paste': que controla el texto que se va a pegar, y suprime los tags HTML que no permito en dicho campo,
· 'key': que controla la escritura de texto, hasta llegar a un nº máximo de caracteres establecidos.

Evidentemente, incluir o modificar éstos, es cuestión de cambiar el código.

Incluyo este ejemplo con 'paste' y 'key' porque sé que hay muchos ejemplos para incluir una limitación de caracteres en CKEditor, pero no es fácil encontrarlos.

Respecto a la función para eliminar los tags no permitidos, os adjunto el código un poco más abajo.

FUNCION PARA ELIMINAR TAGS NO PERMITIDOS

/* Variable global que controla los tags permitidos en la edición */
var tagsPermitidas = '<div><p><span><h1><h2><h3><h4><h5><h6><li><ul><ol><b><strong><small><u><i><em><a><sup><sub>';
/**
* Devuelve un codigo HTML limpio de etiquetas, salvo las permitidas
* @param {String} Cadena de entrada
* @param {String} Tags de apertura permitidos
* @return {String} Cadena limpia
*/
function strip_tags(input, allowed) {
    allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(''); // making sure the allowed arg is a string containing only tags in lowercase (<a><b><c>)
    var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
       commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;

    return input.replace(commentsAndPhpTags, '').replace(tags, function ($0, $1) {
        return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
    });
}

CODIGO PARA CONTROLAR EL TAMAÑO MÁXIMO checkLength: 

Referencia en el blog dotRody CKEditor Maximun Length.

NOTA: Tener en cuenta que el límite máximo indicado en la instancia, hace referencia al texto, y no al conjunto total con sus estilos y tags html. Si no se tiene en cuenta la dimensión del texto con éstos parámetros, nos podemos llevar una mala sorpresa al insertarlo en la DDBB, donde tendremos un error de 'Overflow'.

Espero que os sirva y os ahorre un buen tiempo de búsqueda.

Un saludo a todos!
[...]

Leer más >>