[LibreOffice] Copiar estilos entre documentos

Así que has creado una serie de estilos en tu documento .odt (LibreOffice) que te gustaría reutilizar en otro .odt distinto… Bien, aquí va una receta rápid para hacerlo.

Abre los dos .odt y desde cualquiera de ellos, selecciona File/Templates/Organize

Doble click en el nombre de los documentos. Se abrirá un submenú «Styles». Doble click en «Styles». Se abrirá un listado de los estilos que tiene el documento. Ahora, elige el estilo que quieres copiar, pulsa la tecla Control y arrastra ese estilo de un documento a otro (es importante que pulses Control porque en otro caso, en lugar de copiar, lo moverías). ¡Listo!

Hackit’2012, solucionario. Level 2

En el nivel 2 vemos que cada vez que pulsamos una tecla dentro del input del formulario, según la consola (Developer Tools) de Chrome, pestaña Network, estamos enviando una petición Ajax al servidor. Si pulsamos sobre el nombre del script invocado (jscheck), veremos en la consola algo como lo siguiente:
, lo cual parece indicar que la longitud del password que estamos introduciendo no es la correcta. Podemos pegar en el navegador la URL del script jscheck con el parámetro adecuado, e ir probando hasta obtener un error distinto al ERR:LEN.

https://hackit2012.marcansoft.com/hackit/2/jscheck?password=123456789

De esta forma conseguimos averiguar la longitud de la clave (9 caracteres). Pero ahora el error «ERR:IDX:0» parece indicar que la posición 0 de nuestra clave es incorrecta. Mediante un sencillo script podemos iterar sobre el primer carácter hasta averiguar que es la A.

https://hackit2012.marcansoft.com/hackit/2/jscheck?password=A23456789

Ahora el error es «ERR:IDX:1». Sigue al conejo blanco 🙂

Hackit’2012, solucionario. Level 1.

Para no perder las buenas costumbres y de paso aprender algo más por el camino, tengo la intención de ir comentando las soluciones a 6 de los niveles del HackIt 2012 que se celebró en la Euskal Encounter en Julio. El organizador del concurso, marcan, ha publicado en su web todas las pruebas, para que podamos salsear con ellas.

El nivel 1 es muy sencillo. Si nos fijamos en el código fuente de la página, veremos:

<script type="text/javascript">// <![CDATA[
function check() {var p=$('#password').val();var o=[42,96,21,102,18,85,48,68,48,89,55,80,3,119,22,100,16,117,17];if(p.length!=(o.length-1)){return false;}for(i=0;i<(o.length-1);i++){if(p.charCodeAt(i)!=(o[i+1]^o[i])){return false;}}return true;}
$(document).ready(function(){$('#password').keyup(function(e){$('#password').css({'background-color':(check()?'#8f8':'#f88')});});
});
// ]]></script>

Así pues, el código busca el password tecleado en el formulario y compara su longitud con la del array o (-1). Si son iguales, comienza una comparación letra a letra del password tecleado con el array o. En concreto, busca que la posición i del password sea igual a o[i+1]^o[i] (el operador ^ es un XOR). Esto lo podemos calcular fácilmente haciendo uso de la consola del navegador (en Chrome: pulsamos Shift+Ctrl+J):

[Vim] e365 failed to print postscript file

Nota rápida por si a alguien más le viene bien. La cuestión es que desde Vim no podía imprimir (desde LibreOffice lo hacía sin problemas). El error que arrojaba Vim era:

e365 failed to print postscript file

La cuestión es que el comando lpr (comando Linux para imprimir que Vim usa internamente) intentaba lanzar el trabajo a la impresora por defecto y ésta no estaba definida. En Ubuntu uso el sistema de impresión CUPS. Según el manual de CUPS, para conocer los nombres de impresoras disponibles podemos usar el comando lpstat:

$ lpstat -p -d

Y una vez conocido el nombre de las impresoras, puedes fijar una por defecto con lpoptions:

$ lpoptions -d hp_LaserJet_1300

¡Listo! Vim (GVim en mi caso) imprime ahora perfectamente 🙂

Buscar cadenas de texto dentro de ficheros ODT

Como sabéis, los ficheros ODT de LibreOffice son simples ficheros .zip . Dentro de ellos, encontramos distintos archivos xml, gráficos incrustados, etc. Un ejemplo:

$ unzip -l herramientas.odt 
Archive:  herramientas.odt
  Length      Date    Time    Name
---------  ---------- -----   ----
       39  2012-07-20 12:00   mimetype
      997  2012-07-20 12:00   meta.xml
     8798  2012-07-20 12:00   settings.xml
    12512  2012-07-20 12:00   content.xml
     7003  2012-07-20 12:00   Thumbnails/thumbnail.png
       22  2012-07-20 12:00   layout-cache
      899  2012-07-20 12:00   manifest.rdf
        0  2012-07-20 12:00   Configurations2/popupmenu/
        0  2012-07-20 12:00   Configurations2/images/Bitmaps/
        0  2012-07-20 12:00   Configurations2/toolpanel/
        0  2012-07-20 12:00   Configurations2/statusbar/
        0  2012-07-20 12:00   Configurations2/toolbar/
        0  2012-07-20 12:00   Configurations2/progressbar/
        0  2012-07-20 12:00   Configurations2/menubar/
        0  2012-07-20 12:00   Configurations2/floater/
        0  2012-07-20 12:00   Configurations2/accelerator/current.xml
    12033  2012-07-20 12:00   styles.xml
     1185  2012-07-20 12:00   META-INF/manifest.xml
---------                     -------
    43488                     18 files

El problema viene cuando tienes una carpeta llena de ficheros .ODT y quieres buscar un texto en concreto en todos ellos. Al tratarse de ficheros comprimidos, no vale con usar ni el comando strings ni el comando grep, porque no encontrará lo que buscas.

¿Solución? Convertir los .odt a texto con el comando odt2txt (funciona también para .odg y otros formatos):

for i in *.odt; 
do 
   echo $i; 
   echo "*************"; 
   odt2txt $i | grep -i cadena_de_texto_a_buscar; 
done

Ese bucle for recorre todos los ficheros con extensión .odt, los convierte a texto (no genera ficheros nuevos, la conversión se realiza hacia la salida estándar) y los pasa por un pipe a grep, que realiza la búsqueda. El echo $i con los *** sirve para remarcar el nombre del fichero en el que se encontró la cadena.