BrOffice.org: Um inventivo sistema de controle de versões para o OpenOffice.org

Por Dmitri Popov (23/07/2007 – 9:00:00 AM)


Original em inglês: http://www.linux.com/feature/118083

Embora o OpenOffice.org permita que você salve múltiplas versões de um documento, esse recurso possui uma série de problemas que limitam sua utilidade. Para os iniciantes, salvar todas as versões de um documento no mesmo arquivo é o mesmo que colocoar todas as suas fichas em um cavalo só. Mais importante, esse mecanismo torna difícil compartilhar versões dos documentos com outros usuários e controlar as mudanças feitas no documento. Uma alternativa, um sistema completo de versionamento ou uma solução dedicada para o gerenciamento de documentos é supérflua se tudo o que você precisa é de uma forma simples de manter modificações em versões de um documento e permitir que outros usuários saibam delas. Uma solução mais compromissada usa o OpenOffice.org para manter um feed RSS com as mudanças no documento.

A solução completa consiste em um arquivo do Writer que contêm os dados do feed RSS, e uma macro em OpenOffice.org Basic que faz duas coisas: salvar uma versão dos documentos atualmente abertos e criar um item no feed RSS ligando-o à versão salva. Para melhor entendimento de como essa macro funciona, vamos dar uma olhada em um feed RSS que tem as informações que precisamos para o controle de versões.

  <?xml version="1.0"?>

  <rss version="2.0">

    <channel>

      <title>OpenOffice.org RSS Feed</title>

      <link>http://192.168.1.7</link>

      <description>A simple feed that tracks changes in OpenOffice.org documents</description>

      <language>en-us</language>

      <generator>OpenOffice.org 2.2.1</generator>

      <item>

        <title>Loremipsum.odt</title>

        <description>Initial version of the document.</description>

        <guid>http://192.168.1.7/Loremipsum.odt</guid>

      </item>

    </channel>

  </rss>

Como você pode ver, o feed nada mais é que um arquivo XML plano composto por duas partes: um preâmbulo estático que contêm informação de meta-dados sobre o feed (título, descrição, etc…) e os items do feed, o que incluí nomes, descrições e links para os documentos apropriados.
Olhando para o feed, é fácil imaginar que a macro deveria simplesmente criar um novo item para cada versão salva do documento e o escrever no arquivo RSS. Embora o OpenOffice.org possa ler e escrever arquivos de texto puro, ele não é muito bom ao manipular. É por isso que iremos criar um arquivo de documento do Writer (por exemplo: RSS.odt) que conterará o feed RSS. A macro então irá usar esse arquivo para criar as novas entradas RSS e salvá-las em um arquivo .xml. Inicialmente, o arquivo RSS.odt deverá conter um feed vazio sem nenhum item nele:

  <?xml version="1.0"?>

  <rss version="2.0">

    <channel>

      <title>OpenOffice.org RSS Feed</title>

      <link>http://192.168.1.7</link>

      <description>A simple feed that tracks changes in OpenOffice.org documents</description>

      <language>en-us</language>

      <generator>OpenOffice.org 2.2.1</generator>

    </channel>

  </rss>

Uma vez que o documento RSS.odt estiver pronto, você pode começar a trabalhar na macro. Primeiro, você tem que definir algumas variáveos e checar se o documento foi salvo:

  Sub AddRSSItem()

  Dim ObjSearch As Object

  Dim Args(0) As New com.sun.star.beans.PropertyValue

  ThisDoc=ThisComponent

  If ThisDoc.hasLocation=False Then

  MsgBox ("You must save the document first!", , "Attention!") :End

  End If

Em seguida, a macro terá que obter o nome do arquivo atualmente aberto, pois ele será usado como o título da entrada no feed:

  DocURL=ThisDoc.getURL()

  FileName=Dir(DocURL, 0)

Uma vez que a macro escreve primeiro a entrada de RSS no documento RSS.odt e em seguida o grava como um arquivo XML, você precisa especificar três valores: o caminho para o arquivo RSS.odt, o caminho onde o XML de saída deverá ser salvo e o nome do arquivo XML.

  RSSFile="ftp://user:password@192.168.1.7/web/RSS.odt"

  RSSPath="ftp://user:password@192.168.1.7/web/"

  RSSXMLFile="rss.xml"

No exemplo acima, tanto o RSS.odt quanto o arquivo rss.xml resultante estão armazenados no mesmo local em um servidor FTP local, portanto os usuários de RSS locais podem assinar o feed RSS. Mas você pode publicar o feed RSS em um servidor Web e manter o documento RSS.odt em sua máquina local.

A macro também adiciona um timestamp que atua como identificador único de cada versão salva. Há várias formas de fazer-se isso, dependendo de como você quiser o adicionar. O código abaixo adiciona-o como um prefixo AAAAMMDD_HH-MM-SS_ ao dcoumento. Ele então utiliza o RSSPath para salvar a versão do documento no mesmo local no arquivo rss.xml, desse modo tornando mais fácil ligá-lo a ele:

  Timestamp=CDateToISO(Date) & "_" & Format(Hour(Now), "00") &_

  "-" & Format(Minute(Now), "00") & "-" &_

  Format(Second(Now), "00")

  VersionPath = RSSPath & Timestamp & "_" & FileName

Uma vez que a macro tenha todos os elementos necessários, ele salva a versão do documento atual com o timestamp:

  Args(0).Name="Overwrite"

  Args(0).Value=True

  ThisDoc.storeToURL(VersionPath, Args())

O próximo passo é atualizar o feed RSS para refletir as mudanças. Primeiro, a macro abre o arquivo RSS.odt e notifica o usuário para que ele entre com uma descrição das mudanças.

  ThisDoc=StarDesktop.loadComponentFromURL(RSSFile, "_blank", 0, Array())

  ChangesDescription=InputBox("Summary of changes", "Enter a brief description of changes" , "")

Usando as informações fornecidas, a macro então tem que gerar uma nova entrada RSS e a inserir no arquivo RSS.odt. O último passo é um pouco mais complicado, pois a nova entrada tem que ser adicionada antes das tags . Uma forma de resolver esse problema é usar uma rotina de busca e substituição para encontrar a tag e a substituir pela nova entrada RSS seguida por . Outro problema é que a rotina padrão de busca e substituição do OOoBasic ignora quebras de linhas definidas pelo código CHR(13). Isso quer dizer que o feed RSS inteiro será adicionado como uma linha. Embora isso não faça diferença na análise do RSS por parsers, isso o torna mais complexo de ser lido. Felizmente, existe uma forma simples de contornar o problema, que é usar expressões regulares e usar o código \n para inserir as quebras de linha. O bloco de código final para busca e substituição irá parecer-se com algo assim.


  RSSEnd="</channel>"

  NewRSSItem=Chr(13) & "<item>n <title>"& FileName & "</title>n <description>" & ChangesDescription &_

  "</description>n <guid>" & VersionPath & "</guid>n </item>nn</channel>"

  ThisDoc=ThisComponent

  ObjSearch=ThisDoc.createReplaceDescriptor

  ObjSearch.SearchString=RSSEnd

  ObjSearch.ReplaceString=NewRSSItem

  ObjSearch.SearchWords=true

  ObjSearch.SearchRegularExpression=true

  nReplace=ThisDoc.ReplaceAll(ObjSearch)

A macro está praticamente pronta; basta agora salvar o documento RSS.odt, então salvá-lo como um arquivo XML, e fechá-lo para deixar tudo certo:

  ThisDoc=ThisComponent

  ThisDoc.Store

  Args(0).Name="FilterName"

  Args(0).Value="Text"

  ThisDoc.StoreAsURL (RSSPath & RSSXMLFile, Args())

  ThisDoc.Close(True)

  End Sub

E é isso: uma solução caseira de controle de versões está pronta para ser publicada. Mova o documento RSS.odt para a localização adequada, tenha certeza que todos os caminhos para a macro estão corretos e comece a usá-lo. Outros usuários então poderão assinar o feed RSS gerado e manter-se informados sobre as mudanças no documento.

Dmitri Popov é um escritor freelancer cujos artigos aparecem em revistas de informática na Rússia, Inglaterra, Estados Unidos, Alemanha e Holanda.

Powered by ScribeFire.

Sobre Fábio Emilio Costa
Linux, Free Software, EMACS, Rugby, Indycar, Doctor Who, Harry Potter... Yep, this is me!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s