Convertir urls a enlaces Html en Java

Esta semana me he encontrado con un problema interesante en el trabajo: en una aplicación en desarrollo se usa un editor wysiwyg que no traduce de forma automática una url al código html necesario para que se convierta en un enlace. Y además tampoco se puede tocar el código javascript del editor, para no tener problemas con la licencia de uso y distribución.

Así que la única solución que quedaba era traducir esas urls a html en el servicio de negocio (Java), con la problemática de tener que detectarlas y además distinguir si esas urls ya formaban parte de un código html bien formado, o si estaban repetidas.

Es decir que si en el editor se escribe:

http://www.treelogic.com

La función nos devolvería el código html para que se represente como un enlace:

http://www.treelogic.com

En cambio, con el siguiente código, no debería alterar nada, pues las urls pertenecen a html bien formado:

http://www.google.es
logo google

Tras mucho buscar, y ver que todas las soluciones se referían sólo al problema de identificar una url en un string, encontré una gran ayuda en la documentación de la clase Pattern y en concreto el apartado de Special constructs (non-capturing), para poder ignorar las urls que ya forman parte de código html válido.

La función en cuestión:

	/**
	 * Finds all URLs in a given String and converts them to the html link code
	 * ignoring the urls used in existing html code.
	 *
	 * @param content
	 * @return content
	 * @author Alberto Calderón Queimadelos
	 */
	public String convertUrlsToLinks(String content) {
		Pattern URLPattern = Pattern.compile("(?<!=\")(https?|ftp|file)://[-a-" +
				"zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_| ](?=<)(?!</a>)");
		Matcher linkMatcher = URLPattern.matcher(content);
		String subString;
		while (linkMatcher.find()) {
			subString = content.substring(linkMatcher.start(),linkMatcher.end());
			content=linkMatcher.replaceFirst(" <a href=\"" + subString + "\" " +
				"target=\"_blank\">" + subString + "</a> ");
			linkMatcher = URLPattern.matcher(content);
		}
		return content;
	}

La expresión regular explicada:

  • (?<!=\”) Se ignoran todas las urls que comiencen con un =”, para evitar todas las que se usen en un src=”", href=”", img=”", value=”", data=”" ó codebase=”"
  • (https?|ftp|file) Las urls pueden comenzar por http, https, ftp o file.
  • ://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_| ] El patrón principal de la url.
  • (?=<) Si terminan en < no lo cogemos como parte de la url, pues podría ser un </p>, <br />, etc…
  • (?!</a>) Además ignora todas las que terminen en </a> para evitar las que formen parte de un enlace.

[Curso] Gestión de Proyectos I+D+i

La semana pasada acabé el curso sobre Gestión de Proyectos de I+D+i en el Ámbito Informático organizado por el CITIPA.

La verdad me hizo polvo tener que ir a clase justo después de salir de trabajar un Viernes, sin apenas tiempo para hacer la digestión y aguantar despierto hasta las 9. Y luego levantarme el Sábado como si fuese un dia más de trabajo para volver a clase de 9 a 2. Espero que en el curso de adaptación al Grado se lo tomen con algo más de calma, porque los horarios parecen serán los mismos: viernes por la tarde y sábado por la mañana.

El contenido del curso fué bastante interesante, sobre todo el tema de financiación y redacción de propuestas. Algunas cosas me sonaban de conversaciones en el trabajo, pero en general estaba bastante verde, tras casi dos años en un departamento de I+D+i.

Algo que me ayudará bastante es la forma de orientar un proyecto, y sobre todo el tipo de objetivos que se suelen buscar, porque tener ideas es muy dificil, pero más aún sin saber el tipo de solución que sería más adecuada aplicar.

Sigo esperando a que saquen fechas para el curso de peritajes en informática, parece que no va a llegar nunca.

[Firefox 7] Convertir la barra de menu en un botón

Acabo de descubrir cómo ganar 1 cm vertical de pantalla en Firefox, una buena mejora para navegar con la pantalla panorámica de un portatil.

Menú “Ver” » “Barra de Herramientas” » Desmarcar la opción “Barra de menús”

quitar la barra de menu de firefox

El título de la ventana se transforma en un botón naranja que nos da acceso a todos los menús:

Siempre podremos restaurar la barra de menús si no nos convence:

restaurar la barra de menu de firefox

O también mostrar / ocultar la barra de menús pulsando la tecla “Alt”.