<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Via SIG &#187; PlanetaSIG</title>
	<atom:link href="http://blog.viasig.com/category/planetasig/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.viasig.com</link>
	<description>Um blog sobre SIG, focado na tecnologia, programação e gestão.</description>
	<lastBuildDate>Wed, 21 Jul 2010 18:21:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Novo fornecedor de alojamento</title>
		<link>http://blog.viasig.com/2009/11/novo-fornecedor-de-alojamento/</link>
		<comments>http://blog.viasig.com/2009/11/novo-fornecedor-de-alojamento/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 00:41:26 +0000</pubDate>
		<dc:creator>duarte</dc:creator>
				<category><![CDATA[Gestão]]></category>
		<category><![CDATA[PlanetaSIG]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://blog.viasig.com/?p=444</guid>
		<description><![CDATA[Espero que este seja o meu último post sobre alojamento de sites por muitos e bons anos!
Concluí a transferência do domínio viasig.com (blog e planetasig) para um novo fornecedor.  Já relatei aqui a razão que me levou a mudar da Esoterica para outro fornecedor e não desejo voltar a ter problemas deste género&#8230;
Mas acabou por [...]]]></description>
			<content:encoded><![CDATA[<p>Espero que este seja o meu último post sobre alojamento de sites por muitos e bons anos!</p>
<p>Concluí a transferência do domínio viasig.com (blog e planetasig) para um novo fornecedor.  Já relatei aqui a razão que me levou a mudar da Esoterica para outro fornecedor e não desejo voltar a ter problemas deste género&#8230;</p>
<p>Mas acabou por ser uma experiência positiva porque acabei por ficar melhor servido. Se não vejamos as condições do novo serviço:</p>
<div>
<table class="viasig" style="width: auto; margin-left: auto; margin-right: auto;" border="0" cellspacing="0">
<thead></thead>
<tbody>
<tr>
<td>Preço Anual</td>
<td>29,40€</td>
</tr>
<tr>
<td>Espaço em disco</td>
<td>1 GB</td>
</tr>
<tr>
<td>Tráfego</td>
<td>Ilimitado</td>
</tr>
<tr>
<td>Domínios</td>
<td>1</td>
</tr>
<tr>
<td>Subdomínios</td>
<td>Ilimitados</td>
</tr>
<tr>
<td>PHP</td>
<td>4 e 5</td>
</tr>
<tr>
<td>Python</td>
<td>2.4.3</td>
</tr>
<tr>
<td>Tomcat/JSP</td>
<td>ok</td>
</tr>
<tr>
<td>Ruby</td>
<td>ok</td>
</tr>
<tr>
<td>MySQL</td>
<td>5.0</td>
</tr>
<tr>
<td>PostgreSQL</td>
<td>8.1</td>
</tr>
<tr>
<td>Tarefas Agendadas</td>
<td>Cron</td>
</tr>
<tr>
<td>Acesso Shell</td>
<td>JailedShell</td>
</tr>
</tbody>
</table>
</div>
<p>Por um preço muito semelhante consigo mais 3 características a que não tinha acesso e que fazem uma grande diferença:</p>
<ol>
<li>Tarefas agendadas para controlar facilmente o refrescamento das entradas no Planeta SIG;</li>
<li>Acesso Shell para perceber os problemas com os scripts do Planeta SIG (<a title="Planet Venus source code" href="http://intertwingly.net/code/venus/" target="_blank">Planet Venus</a>);</li>
<li>e ainda&#8230; PostgreSQL!!</li>
</ol>
<p>Na verdade o meu novo fornecedor &#8211; <a title="novo fornecedor de alojamento" href="http://www.yourdotstore.com/techdomain/" target="_blank">Lefatech</a> &#8211; não inclui o acesso à shell de raíz neste pack. Mas bastou-me solicitar, justificando a necessidade, e o acesso foi configurado na hora. Em contraste, quando pedi à Esoterica para criar uma tarefa agendada informaram-me que teria de fazer um upgrade para um plano que custa 108€/ano!</p>
<p>Com este novo alojamento ainda ganho o suporte a PostgreSQL o que poderá ser útil se surgir a oportunidade de criar algum site com mapas dinâmicos. Faltará o módulo PostGIS, mas também faltava o módulo mod_python ao Apache, e foi compilado e configurado pelo suporte técnico em poucos dias. Por isso pode ser que se consiga o PostGIS se for necessário!</p>
<p>A transferência para o novo servidor ficou activada hoje, sem que eu notasse qualquer anomalia. Aproveitei para actualizar o Wordpress para a última versão (2.8.6). Se algum leitor notar algum problema por favor avise-me usando os comentários.</p>
<p>A propósito, o WP ganhou o <a title="2009 Open Source CMS Award" href="http://www.packtpub.com/award" target="_blank">prémio de melhor CMS Open Source de 2009</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viasig.com/2009/11/novo-fornecedor-de-alojamento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pequeno problema com feeds do Planeta SIG</title>
		<link>http://blog.viasig.com/2009/11/pequeno-problema-com-feeds-do-planeta-sig/</link>
		<comments>http://blog.viasig.com/2009/11/pequeno-problema-com-feeds-do-planeta-sig/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 00:10:08 +0000</pubDate>
		<dc:creator>duarte</dc:creator>
				<category><![CDATA[PlanetaSIG]]></category>

		<guid isPermaLink="false">http://blog.viasig.com/?p=441</guid>
		<description><![CDATA[Enquanto tentava resolver o problema de executar python para refrescar os artigos no Planeta SIG, parece que acabei por baralhar os feeds, entre o Planeta SIG e o meu próprio blog&#8230; penso ter tudo resolvido, e ficam aqui as minhas desculpas pelo lapso.
Em breve mudarei o domíno viasig.com para uma nova empresa de hosting para [...]]]></description>
			<content:encoded><![CDATA[<p>Enquanto tentava resolver o problema de executar python para refrescar os artigos no Planeta SIG, parece que acabei por baralhar os feeds, entre o Planeta SIG e o meu próprio blog&#8230; penso ter tudo resolvido, e ficam aqui as minhas desculpas pelo lapso.</p>
<p>Em breve mudarei o domíno viasig.com para uma nova empresa de hosting para garantir que este tipo de problemas sejam mais fáceis de resolver!!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viasig.com/2009/11/pequeno-problema-com-feeds-do-planeta-sig/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resolvido o problema do Planeta SIG</title>
		<link>http://blog.viasig.com/2009/11/resolvido-o-problema-do-planeta-sig/</link>
		<comments>http://blog.viasig.com/2009/11/resolvido-o-problema-do-planeta-sig/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 18:42:05 +0000</pubDate>
		<dc:creator>duarte</dc:creator>
				<category><![CDATA[PlanetaSIG]]></category>
		<category><![CDATA[Adicionar nova tag]]></category>
		<category><![CDATA[blog]]></category>

		<guid isPermaLink="false">http://blog.viasig.com/?p=428</guid>
		<description><![CDATA[O Planeta SIG deixou de ser actualizado por uns dias. Penso que agora a situação está normalizada. Por agora será actualizado 4h em 4h, e posteriormente pretendo voltar à actualização em intervalos de 1h.
Nunca me tinha defrontado com problemas no relacionamento com a empresa que me fornece o hosting, ou seja, o serviço onde alojo [...]]]></description>
			<content:encoded><![CDATA[<p>O <a title="Agregador de notícias SIG em PT e vizinhos" href="http://planetasig.viasig.com/" target="_blank">Planeta SIG</a> deixou de ser actualizado por uns dias. Penso que agora a situação está normalizada. Por agora será actualizado 4h em 4h, e posteriormente pretendo voltar à actualização em intervalos de 1h.</p>
<p>Nunca me tinha defrontado com problemas no relacionamento com a empresa que me fornece o hosting, ou seja, o serviço onde alojo o Planeta SIG.</p>
<p>O serviço funcionou praticamente de forma automática durante quase 1 ano. E um destes dias o site desapareceu completamente… a Esoterica suspendeu o domínio. Ao consultar a minha conta de email pessoal lá estava um email enviado há 5 horas dizendo que havia um problema com o meu domínio, e que estava a comprometer a estabilidade do servidor, onde outros utilizadores teriam os seus sites.</p>
<p>Naturalmente que um só cliente não pode prejudicar tantos outros. E a suspensão não me parece assim tão mal dadas as circunstâncias. O que é lamentável é a forma como o processo de re-activar o Planeta SIG foi executado… levando a uma paragem de 1 semana. Sucedeu que decidiram bloquear algumas das funções necessárias à actualização do Planeta SIG, e por mais que tentasse foi-me impossível executar o script de actualização. O software que uso é o mais utilizado em todo o mundo, sendo a base de outros planetas como o <a href="http://planet.wordpress.org/" target="_blank">Planet WordPress</a>, o <a href="http://planet.ubuntu.com/" target="_blank">Planet Ubuntu</a>, ou o “nosso” <a href="http://planetgs.com/" target="_blank">Planet Geospatial</a>. Portanto, não será propriamente software malicioso…</p>
<p>Neste momento, consigo já executar o script. E espero que a situação se mantenha assim.</p>
<h4>Qual foi o problema?</h4>
<p>O que aconteceu foi um bug no processo de actualização do site. Como não tenho acesso às capacidades de agendamento de tarefas do servidor, usei um serviço que de 1  em 1 h chamava o script de actualização.</p>
<p>Tudo corria muito bem. Mas a dada altura, algo mudou no servidor, e o script começou a devolver erros de timeout. O erro de timeout não impedia que o script concluísse as tarefas de actualização e por isso no Planeta SIG tudo parecia normal. O problema foi que ao receber o erro de timeout, o tal serviço que devia executar o script 1h/1h passou a fazê-lo a cada minuto! Ou seja, o servidor foi inundado de pedidos para executar o meu script de actualização! Oops.</p>
<p>Bom, a solução foi resolver este bug. E a partir daqui ignorar os erros de timeout. E garantir que só se executa o script de actualização no intervalo estabelecido de 1h.</p>
<p>Só que nesta altura a Esoterica começou a dificultar as coisas, apertando as restrições de segurança ao ponto de não conseguir executar o script de actualização. E isto arrastou-se por 1 semana.</p>
<h4>Decisões, decisões</h4>
<p>O poder negocial dos clientes é realmente muito pequeno frente às empresas que fornecem o alojamento de sites, e a facilidade com que estas podem abusar da sua posição é preocupante, mesmo que nem se apercebam que a atitude que estão a tomar pode ser violenta para o cliente e destruir um projecto.</p>
<p>A hipótese de mudar de fornecedor de alojamento foi a primeira ideia que me ocorreu e tenho já seleccionadas as alternativas que me pareceram melhores. Mas… há sempre a probabilidade do problema voltar a acontecer.</p>
<p>A hipótese de passar a usar um PC em casa como servidor web é por isso muito atractiva, pela independência que oferece. Alguém sabe quanto custará, em electricidade, manter um PC ligado o ano inteiro? E o custo de ter um endereço IP fixo?</p>
<p>Para o custo de electricidade encontrei referências a preços de 2008:</p>
<blockquote><p>Um PC que consome 200w em tarifa bi-horária, 30 dias por mês, 12 meses por ano, pagou em 2008 13,35€ por mês, num total anual de 160€.</p></blockquote>
<p>A somar ainda o custo de ter um IP fixo (que não qual é)…</p>
<p>Comparando com o custo de 20€/ano para ter um serviço de hospedagem, a opção caseira é um tudo-nada mais caro.</p>
<h4>Conclusão e Futuro</h4>
<p>Em resultado destas dificuldades, e por ter a sempre incerteza sobre se o serviço de actualização não voltará a provocar um problema destes, comecei a desenvolver um PlanetaSIG em PHP, baseado na excelente biblioteca <a href="http://simplepie.org/" target="_blank">SimplePie</a>. Mas o tempo é curto e não sei quando terminarei. A outra coisa a fazer é encontrar um serviço de hospedagem que permita a utilização de tarefas agendadas a um preço baixo. Se alguém souber de um, estou muitíssimo interessado!</p>
<p>Até breve.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viasig.com/2009/11/resolvido-o-problema-do-planeta-sig/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PlanetaSIG com extractos de posts com 500 caracteres</title>
		<link>http://blog.viasig.com/2009/07/planetasig-com-extractos-de-posts-com-500-caracteres/</link>
		<comments>http://blog.viasig.com/2009/07/planetasig-com-extractos-de-posts-com-500-caracteres/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 22:53:46 +0000</pubDate>
		<dc:creator>duarte</dc:creator>
				<category><![CDATA[PlanetaSIG]]></category>

		<guid isPermaLink="false">http://blog.viasig.com/2009/07/planetasig-com-extractos-de-posts-com-500-caracteres/</guid>
		<description><![CDATA[A pedido de um dos autores, a partir de hoje, o PlanetaSIG tem a capacidade de mostrar apenas os primeiros N caracteres de cada post. A configuração proposta é mostrar 500 caracteres, permitindo aos leitores do agregador decidir se lhe interessa visitar o blog original para ler o post completo.
O agregador tem funcionado inspirado no [...]]]></description>
			<content:encoded><![CDATA[<p>A pedido de um dos autores, a partir de hoje, o PlanetaSIG tem a capacidade de mostrar apenas os primeiros N caracteres de cada post. A configuração proposta é mostrar 500 caracteres, permitindo aos leitores do agregador decidir se lhe interessa visitar o blog original para ler o post completo.</p>
<p>O agregador tem funcionado inspirado no PlanetGS e como tal mostra numa única página os posts de forma integral, dos blogs que agrega.</p>
<p>Pessoalmente, leio o PlanetaSIG bem como outros planetas e blogs com o Google Desktop, usando a sidebar onde vejo os títulos dos itens a serem refrescados. Ao clicar num item, é aberto directamente o blog original, sem passar pelo PlanetaSIG (ou outro agregador).</p>
<p>Acontece que o PlanetaSIG pode ser consultado directamente, visitando a página. E nesse caso é bem possível que esse visitante já não irá visitar os blogs originais, reduzindo o tráfego desses blogs. E compreendo perfeitamente os autores que querem evitar esta situação (e mesmo que não concordasse agiria da mesma forma – o autor é soberano).</p>
<p>Com esta nova possibilidade espero resolver a questão de forma simpática para todos.</p>
<p>Portanto, quem tem o seu blog agregado no PlanetaSIG e que assim deseje pode enviar-me um email e eu configurarei o seu feed para mostrar apenas um extracto dos posts. O modo default para quem não se manifestar continuará a ser mostrar os posts integrais, mantendo um pouco a mesma lógica dos planetas mais globais como o PlanetGS e o PlanetOSGeo.</p>
<p>Aproveito para pedir sugestões para blogs que possam ser incluídos no PlanetaSIG!!</p>
<h4>Detalhes técnicos</h4>
<p>O PlanetaSIG é gerado pelo software Venus, escrito em Python. O Venus não permite de raíz configurar o n.º de caracteres a mostrar em cada post, nem permite usar o sumário ou excerpto incluído nos feeds, em vez de mostrar o conteúdo. Já antes tinha tentado configurar o Venus para fazer esse efeito mas sem sucesso.</p>
<p>Mas o Venus tem a capacidade de aplicar filtros a cada feed RSS, e de forma independente. Ou seja, podemos aplicar um filtro a um feed, e outro filtro diferente noutro feed, e até ter outros feeds sem filtro algum.</p>
<p>Um filtro é um pequeno script escrito em Python (também pode ser um xslt), que vai ser executado para cada item dentro de um feed, podendo transformá-lo da maneira como o programador quiser. Por exemplo, podem retirar-se todas as referências a imagens, ou substituir tags &lt;h1&gt; por &lt;h3&gt; ou outro qualquer, aplicar classes css a determinados tags, etc.</p>
<p>O que acabei por fazer foi criar um filtro que pega no &lt;content&gt; de cada post e o substitui por apenas os primeiros N caracteres do original. Este filtro pode ainda substituir o &lt;content&gt; por outro tag qualquer – por exemplo, copiar o sumário para o content. Como o Venus só consegue mostrar o &lt;content&gt;, passa a mostrar o sumário sem saber…</p>
<p>O código do novo filtro foi baseado num filtro que vem já incluído no Venus – excerpt.py. Fica aqui o código para referência futura.</p>
<p>Até breve.</p>
<p><code></p>
<p>Cria um novo elemento ou substitui um existente,       <br />com o texto de outro elemento, truncado com X caracteres.       <br />Baseado no filtro excerpt.py e alterado por Duarte Carreira em 16/Julho/2009. </p>
<p>Parameters:      <br />&#160; width:&#160; maximum number of characters in the excerpt.&#160; Default: 500       <br />&#160; omit:&#160;&#160; whitespace delimited list of html tags to remove.&#160; Default: none       <br />&#160; target: name of element created.&#160; Default: content       <br />&#160; source: name of element to get data from. Default: summary       <br />&#160; replace: yes to delete duplicate target. Default: yes </p>
<p>Example to test:      <br />python tests/reconstitute.py <a href="http://localhost/feedorig.xml">http://localhost/feedorig.xml</a>       <br />--filters &quot;planetaSIG.py?width=500&amp;source=content&amp;target=content&amp;replace=yes&quot;&gt;tes       <br />te3.xml </p>
<p>Notes:      <br />* if you want to avoid duplicate entries use replace=yes.       <br />* Venus does not expose summary in the feeds to tmpl templates. With this filter,       <br />&#160;&#160; you cant replace the text inside content with the text from summary. This is       <br />&#160;&#160; what the default values do.       <br />* if 'img' is in the list of tags to be omitted &lt;img&gt; tags are replaced with       <br />&#160;&#160; hypertext links associated with the value of the 'alt' attribute.&#160; If there       <br />&#160;&#160; is no alt attribute value, &lt;img&gt; is used instead.&#160; If the parent element       <br />&#160;&#160; of the img tag is already an &lt;a&gt; tag, no additional hypertext links are       <br />&#160;&#160; added.       <br />&quot;&quot;&quot; </p>
<p>import sys, xml.dom.minidom, textwrap      <br />from xml.dom import Node, minidom </p>
<p>atomNS = '<a href="http://www.w3.org/2005/Atom'">http://www.w3.org/2005/Atom'</a>       <br />planetNS = '<a href="http://planet.intertwingly.net/'">http://planet.intertwingly.net/'</a></p>
<p>args = dict(zip([name.lstrip('-') for name in sys.argv[1::2]], sys.argv[2::2])) </p>
<p>wrapper = textwrap.TextWrapper(width=int(args.get('width','500')))      <br />omit = args.get('omit', '').split()       <br />target = args.get('target', 'content')       <br />original = args.get('source', 'summary')       <br />replace = args.get('replace','yes') </p>
<p>class copy:      <br />&#160;&#160;&#160; &quot;&quot;&quot; recursively copy a source to a target, up to a given width &quot;&quot;&quot; </p>
<p>&#160;&#160;&#160; def __init__(self, dom, source, target):      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.dom = dom       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.full = False       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.text = []       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.textlen = 0       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.copyChildren(source, target) </p>
<p>&#160;&#160;&#160; def copyChildren(self, source, target):      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&quot;&quot; copy child nodes of a source to the target &quot;&quot;&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; for child in source.childNodes:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if child.nodeType == Node.ELEMENT_NODE:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.copyElement(child, target)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; elif child.nodeType == Node.TEXT_NODE:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.copyText(child.data, target)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if self.full: break </p>
<p>&#160;&#160;&#160; def copyElement(self, source, target):      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&quot;&quot; copy source element to the target &quot;&quot;&quot; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; # check the omit list      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if source.nodeName in omit:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if source.nodeName == 'img':       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return self.elideImage(source, target)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return self.copyChildren(source, target) </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; # copy element, attributes, and children      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; child = self.dom.createElementNS(source.namespaceURI, source.nodeName)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; target.appendChild(child)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; for i in range(0, source.attributes.length):       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; attr = source.attributes.item(i)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; child.setAttributeNS(attr.namespaceURI, attr.name, attr.value)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.copyChildren(source, child) </p>
<p>&#160;&#160;&#160; def elideImage(self, source, target):      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&quot;&quot; copy an elided form of the image element to the target &quot;&quot;&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; alt = source.getAttribute('alt') or '&lt;img&gt;'       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; src = source.getAttribute('src') </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if target.nodeName == 'a' or not src:      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.copyText(alt, target)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; else:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; child = self.dom.createElement('a')       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; child.setAttribute('href', src)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.copyText(alt, child)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; target.appendChild(child) </p>
<p>&#160;&#160;&#160; def copyText(self, source, target):      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&quot;&quot; copy text to the target, until the point where it would wrap &quot;&quot;&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if not source.isspace() and source.strip():       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.text.append(source.strip())       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; lines = wrapper.wrap(' '.join(self.text))       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if len(lines) == 1:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; target.appendChild(self.dom.createTextNode(source))       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.textlen = len(lines[0])       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; elif lines:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; excerpt = source[:len(lines[0])-self.textlen] + u' \u2026'       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; target.appendChild(dom.createTextNode(excerpt))       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; self.full = True </p>
<p># select summary or content element      <br />dom = minidom.parse(sys.stdin) </p>
<p>#source = dom.getElementsByTagNameNS(atomNS, 'summary')      <br />#if not source:       <br />#&#160;&#160;&#160; source = dom.getElementsByTagNameNS(atomNS, 'content')       <br />source = dom.getElementsByTagNameNS(atomNS, original) </p>
<p># if present, recursively copy it to a planet:excerpt element      <br />if source:       <br />&#160;&#160;&#160; fonteelem = source[0]       <br />&#160;&#160;&#160; if target.startswith('planet:'):       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; dom.documentElement.setAttribute('xmlns:planet', planetNS)       <br />&#160;&#160;&#160; if target.startswith('atom:'): target = target.split(':',1)[1]       <br />&#160;&#160;&#160; excerpt = dom.createElementNS(planetNS, target)       <br />&#160;&#160;&#160; source[0].parentNode.appendChild(excerpt)       <br />&#160;&#160;&#160; copy(dom, source[0], excerpt)       <br />&#160;&#160;&#160; #source[0].parentNode.replaceChild(excerpt, source[0])       <br />&#160;&#160;&#160; #if source[0].nodeName == excerpt.nodeName:       <br />&#160;&#160;&#160; #&#160; source[0].parentNode.removeChild(source[0]) </p>
<p>#apagar o original      <br />if replace == 'yes':       <br />&#160;&#160;&#160; source = dom.getElementsByTagName(target)       <br />&#160;&#160;&#160; fonteelem = source[0]       <br />&#160;&#160;&#160; if len(source)&gt;1:       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; source[0].parentNode.removeChild(source[0]) </p>
<p># print out results      <br />print dom.toxml('utf-8')</p>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.viasig.com/2009/07/planetasig-com-extractos-de-posts-com-500-caracteres/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
