<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://www.bertocq.es/wp-atom.php">
	<title type="text">Bertocq</title>
	<subtitle type="text" />

	<updated>2011-10-25T14:19:49Z</updated>

	<link rel="alternate" type="text/html" href="http://www.bertocq.es" />
	<id>http://www.bertocq.es/feed/atom/</id>
	

	<generator uri="http://wordpress.org/" version="3.3.1">WordPress</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/bertocq" /><feedburner:info uri="bertocq" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><feedburner:emailServiceId>bertocq</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry>
		<author>
			<name>bertocq</name>
						<uri>http://www.bertocq.es</uri>
					</author>
		<title type="html"><![CDATA[Convertir urls a enlaces Html en Java]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/bertocq/~3/bFlXYnBiJp8/" />
		<id>http://www.bertocq.es/?p=748</id>
		<updated>2011-10-21T18:58:53Z</updated>
		<published>2011-10-21T18:42:10Z</published>
		<category scheme="http://www.bertocq.es" term="Programación" /><category scheme="http://www.bertocq.es" term="código" /><category scheme="http://www.bertocq.es" term="java" />		<summary type="html"><![CDATA[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 [...]]]></summary>
		<content type="html" xml:base="http://www.bertocq.es/2011/10/21/convertir-urls-a-enlaces-html-en-java/">&lt;p&gt;Esta semana me he encontrado con un problema interesante en el trabajo: en una aplicación en desarrollo se usa un editor &lt;a title="editor wysiwyg" href="http://es.wikipedia.org/wiki/WYSIWYG"&gt;wysiwyg&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Es decir que si en el editor se escribe:&lt;/p&gt;
&lt;pre class="brush: html; gutter: true"&gt;http://www.treelogic.com&lt;/pre&gt;
&lt;p&gt;La función nos devolvería el código html para que se represente como un enlace:&lt;/p&gt;
&lt;pre class="brush: html; gutter: true"&gt;&lt;a href="http://www.treelogic.com" title="Treelogic"&gt;http://www.treelogic.com&lt;/a&gt;&lt;/pre&gt;
&lt;p&gt;En cambio, con el siguiente código, no debería alterar nada, pues las urls pertenecen a html bien formado:&lt;/p&gt;
&lt;pre class="brush: html;gutter: true"&gt;
&lt;a href="http://www.google.es" title="google"&gt;http://www.google.es&lt;/a&gt;
&lt;img src="http://www.google.es/logos/classicplus.png" alt="logo google" /&gt;
&lt;/pre&gt;
&lt;p&gt;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 &lt;a href="http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html"&gt;documentación de la clase Pattern&lt;/a&gt; y en concreto el apartado de &lt;strong&gt;Special constructs (non-capturing)&lt;/strong&gt;, para poder ignorar las urls que ya forman parte de código html válido.&lt;/p&gt;
&lt;p&gt;La función en cuestión:&lt;/p&gt;
&lt;pre class="brush: java; gutter: true"&gt;
	/**
	 * 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("(?&amp;lt;!=\")(https?|ftp|file)://[-a-" +
				"zA-Z0-9+&amp;amp;@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&amp;amp;@#/%=~_| ](?=&amp;lt;)(?!&amp;lt;/a&amp;gt;)");
		Matcher linkMatcher = URLPattern.matcher(content);
		String subString;
		while (linkMatcher.find()) {
			subString = content.substring(linkMatcher.start(),linkMatcher.end());
			content=linkMatcher.replaceFirst(" &amp;lt;a href=\"" + subString + "\" " +
				"target=\"_blank\"&amp;gt;" + subString + "&amp;lt;/a&amp;gt; ");
			linkMatcher = URLPattern.matcher(content);
		}
		return content;
	}
&lt;/pre&gt;
&lt;p&gt;La expresión regular explicada:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(?&amp;lt;!=\&amp;#8221;)&lt;/strong&gt; Se ignoran todas las urls que comiencen con un &lt;strong&gt;=&amp;#8221;&lt;/strong&gt;, para evitar todas las que se usen en un src=&amp;#8221;", href=&amp;#8221;", img=&amp;#8221;", value=&amp;#8221;", data=&amp;#8221;" ó codebase=&amp;#8221;"&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(https?|ftp|file)&lt;/strong&gt; Las urls pueden comenzar por http, https, ftp o file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;://[-a-zA-Z0-9+&amp;amp;@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&amp;amp;@#/%=~_| ]&lt;/strong&gt; El patrón principal de la url.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(?=&amp;lt;)&lt;/strong&gt; Si terminan en &lt;strong&gt;&amp;#60;&lt;/strong&gt; no lo cogemos como parte de la url, pues podría ser un &lt;strong&gt;&amp;#60;&amp;#47;p&amp;#62;&lt;/strong&gt;,&lt;strong&gt; &amp;#60;br &amp;#47;&amp;#62;&lt;/strong&gt;, etc&amp;#8230;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(?!&amp;lt;/a&amp;gt;)&lt;/strong&gt; Además ignora todas las que terminen en &lt;strong&gt;&amp;#60;&amp;#47;a&gt;&lt;/strong&gt; para evitar las que formen parte de un enlace.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/bertocq/~4/bFlXYnBiJp8" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.bertocq.es/2011/10/21/convertir-urls-a-enlaces-html-en-java/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.bertocq.es/2011/10/21/convertir-urls-a-enlaces-html-en-java/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.bertocq.es/2011/10/21/convertir-urls-a-enlaces-html-en-java/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>bertocq</name>
						<uri>http://www.bertocq.es</uri>
					</author>
		<title type="html"><![CDATA[[Curso] Gestión de Proyectos I+D+i]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/bertocq/~3/BiDY50b-j8M/" />
		<id>http://www.bertocq.es/?p=716</id>
		<updated>2011-10-10T18:02:11Z</updated>
		<published>2011-10-10T18:02:11Z</published>
		<category scheme="http://www.bertocq.es" term="Personal" /><category scheme="http://www.bertocq.es" term="citipa" /><category scheme="http://www.bertocq.es" term="cursos" /><category scheme="http://www.bertocq.es" term="i+d+i" />		<summary type="html"><![CDATA[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 [...]]]></summary>
		<content type="html" xml:base="http://www.bertocq.es/2011/10/10/curso-gestion-de-proyectos-idi-2/">&lt;p&gt;La semana pasada  acabé el curso sobre &lt;a href="http://blog.citipa.org/curso-gestion-de-proyectos-de-idi-en-el-ambito-informatico/" title="Curso: Gestión de Proyectos de I+D+i en el Ámbito Informático" target="_blank"&gt;Gestión de Proyectos de I+D+i en el Ámbito Informático&lt;/a&gt; organizado por el &lt;a href="http://www.citipa.org/" title="Colegio Oficial de Ingenieros Técnicos en Informática del Principado de Asturias " target="_blank"&gt;CITIPA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="http://www.treelogic.com" title="Treelogic S.L." target="_blank"&gt;el trabajo&lt;/a&gt;, pero en general estaba bastante verde, tras casi dos años en un departamento de I+D+i.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Sigo esperando a que saquen fechas para el curso de peritajes en informática, parece que no va a llegar nunca.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bertocq/~4/BiDY50b-j8M" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.bertocq.es/2011/10/10/curso-gestion-de-proyectos-idi-2/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.bertocq.es/2011/10/10/curso-gestion-de-proyectos-idi-2/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.bertocq.es/2011/10/10/curso-gestion-de-proyectos-idi-2/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>bertocq</name>
						<uri>http://www.bertocq.es</uri>
					</author>
		<title type="html"><![CDATA[[Firefox 7] Convertir la barra de menu en un botón]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/bertocq/~3/okjCu1vn_r8/" />
		<id>http://www.bertocq.es/?p=672</id>
		<updated>2011-10-25T14:19:49Z</updated>
		<published>2011-10-03T13:35:23Z</published>
		<category scheme="http://www.bertocq.es" term="Desarrollo" /><category scheme="http://www.bertocq.es" term="firefox" /><category scheme="http://www.bertocq.es" term="portatil" />		<summary type="html"><![CDATA[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ú &#8220;Ver&#8221; &#187; &#8220;Barra de Herramientas&#8221; &#187; Desmarcar la opción &#8220;Barra de menús&#8221; El título de la ventana se transforma en un botón naranja que nos da acceso a todos los [...]]]></summary>
		<content type="html" xml:base="http://www.bertocq.es/2011/10/03/la-barra-de-menu-en-firefox-7/">&lt;p&gt;Acabo de descubrir cómo ganar 1 cm vertical de pantalla en &lt;a href="http://www.mozilla.org/es-ES/firefox/" title="Firefox"&gt;Firefox&lt;/a&gt;, una buena mejora para navegar con la pantalla panorámica de un portatil.&lt;/p&gt;
&lt;p&gt;Menú &lt;em&gt;&amp;#8220;Ver&amp;#8221;&lt;/em&gt; &amp;raquo; &lt;em&gt;&amp;#8220;Barra de Herramientas&amp;#8221;&lt;/em&gt; &amp;raquo; Desmarcar la opción &lt;em&gt;&amp;#8220;Barra de menús&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bertocq.es/wp-content/uploads/2011/10/firefoxMenu.png" rel="attachment wp-att-679"&gt;&lt;img src="http://www.bertocq.es/wp-content/uploads/2011/10/firefoxMenu.png" alt="quitar la barra de menu de firefox" title="firefoxMenu" width="516" height="173" class="aligncenter size-full wp-image-679" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;El título de la ventana se transforma en un botón naranja que nos da acceso a todos los menús:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bertocq.es/wp-content/uploads/2011/10/firefox7menu.png" rel="attachment wp-att-677"&gt;&lt;img src="http://www.bertocq.es/wp-content/uploads/2011/10/firefox7menu.png" alt="" title="firefox7menu" width="491" height="120" class="aligncenter size-full wp-image-677" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Siempre podremos restaurar la barra de menús si no nos convence:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bertocq.es/wp-content/uploads/2011/10/firefoxMenu2.png" rel="attachment wp-att-680"&gt;&lt;img src="http://www.bertocq.es/wp-content/uploads/2011/10/firefoxMenu2.png" alt="restaurar la barra de menu de firefox" title="firefoxMenu2" width="555" height="277" class="aligncenter size-full wp-image-680" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;O también mostrar / ocultar la barra de menús pulsando la tecla &amp;#8220;Alt&amp;#8221;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/bertocq/~4/okjCu1vn_r8" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.bertocq.es/2011/10/03/la-barra-de-menu-en-firefox-7/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.bertocq.es/2011/10/03/la-barra-de-menu-en-firefox-7/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.bertocq.es/2011/10/03/la-barra-de-menu-en-firefox-7/</feedburner:origLink></entry>
	</feed>

