5 votos

¿Cómo convertir los archivos .textClipping de Apple a texto plano/HTML?

Si seleccionas algún texto en una aplicación (por ejemplo Safari, Chrome u cualquier otra aplicación que permita arrastrar texto) y arrastras la selección a un panel de Finder, se creará un archivo en el panel con una extensión .textClipping invisible. La extensión puede o no ser visible en Finder dependiendo de tus configuraciones.

Originalmente asumí que el archivo es texto plano e intenté renombrarlo para agregarle una extensión .txt aún así al hacer doble clic se abre con Finder.

Entonces verifiqué el tipo de archivo:

file 'some text.textClipping'
>> some text.textClipping: lista de propiedades binarias de Apple

Cuando hago cat en el archivo muestra una cabecera de bplist00?XUTI-Data? seguida de texto legible.

Intenté:

mv 'some text.textClipping' 'some text.txt'

pero incluso después de esto todavía se abre con Finder y no con la aplicación asociada a los archivos .txt.

Otra 'curiosidad' es que arrastrar un archivo .textClipping al terminal — que a veces uso como forma de insertar la ruta completa — tiene el efecto inesperado de insertar el contenido del archivo en lugar de su ruta.

Ojalá pudiera usar archivos .textClipping para crear rápidamente fragmentos de páginas web y otras aplicaciones, pero por razones obvias, quiero evitar que los fragmentos se almacenen en algún formato binario propietario de Apple.

¿Existe alguna forma de convertir los fragmentos a un formato portable, como texto plano? ¿Por qué este tipo de archivos se comportan de manera diferente a otros? ¿Existe alguna propiedad extendida del archivo? De ser así, ¿cómo eliminarla para que los archivos dejen de ser 'especiales'?

4voto

Richard Marquez Puntos 387

Investigando más sobre las listas de propiedades binarias de Apple, probé plutil -convert xml1 note.textClipping que produce un archivo XML con el texto legible del fragmento como texto UTF-8, luego versiones codificadas en base64 del mismo texto en UTF-16, mac-plain y HTML.

Incluso después de convertir el binario al formato XML, Finder sigue abriendo el archivo en su propio visor sin importar la extensión que se establezca (por ejemplo, .plist o .xml).

Ejecutar /bin/ls -al en la carpeta muestra un @ al lado del nombre del archivo, lo que indica que el archivo tiene atributos extendidos, por lo que parece que están causando el comportamiento 'especial' en Finder.

Esta respuesta me llevó a probar

xattr -l note.plist 

lo cual revela que parte del contenido de la nota se almacena como una clave de atributo extendido.

Y finalmente, eliminando todos los atributos extendidos convirtió el archivo en un archivo 'normal', por lo que ahora se abre con la aplicación asociada:

xattr -c note.plist 

El comando anterior es para un solo archivo, para eliminar los atributos extendidos de todos los archivos en la carpeta actual, ejecute:

xattr -rc .

Los atributos extendidos pueden ser útiles en algunos casos, por ejemplo, si descargaste un archivo con Safari o Chrome, la URL original se almacenará como un atributo extendido que puedes ver con xattr -l myfile.zip o haciendo clic derecho en un archivo en Finder y seleccionando Obtener información > La URL se mostrará bajo Más información > Desde dónde. (Otra razón para no usar wget cuando quieras hacer un seguimiento del origen del archivo).

3voto

Richard Marquez Puntos 387

Un fragmento de python3 que se puede agregar como una Acción Rápida en Finder con la ayuda de la aplicación Automator.app incorporada (Nuevo > Acción Rápida > buscar y arrastrar Ejecutar secuencia de comandos de shell en el panel de trabajo derecho).

import plistlib
import sys
from pathlib import Path

clippath = Path(sys.argv[1])

with clippath.open('rb') as fi:
    plist = plistlib.load(fi)
    data = plist.get('UTI-Data')
    utf8text = data.get('public.utf8-plain-text')
    html = data.get('public.html')

    utf8text and clippath.with_suffix(".txt").write_text(utf8text, encoding='utf-8')
    html and clippath.with_suffix(".html").write_bytes(html)

Así es como debe verse el fragmento en automator (asumiendo que tienes python3 instalado en /usr/local/bin/python3):

introducir descripción de la imagen aquí

Al hacer clic en Guardar en automator te pedirá un nombre (por ejemplo, Convertir Recorte). Una vez guardado, haz clic derecho en un archivo .textClipping en Finder, luego en el menú desplegable selecciona Acciones Rápidas > Convertir Recorte. Se crearán dos nuevos archivos, .txt y opcionalmente, si el fragmento se creó desde una página web, .html. Los recortes creados desde páginas web conservarán formato y enlaces.

2voto

Jacques Puntos 111

En la misma línea que sugirió @ccpizza con python, pero esta vez utilizando perl, puedes crear en Automator un nuevo flujo de trabajo de Acción Rápida y utilizar el siguiente script en su lugar.

Necesitarás instalar RTF::Parser:

  1. Descárgalo

  2. Abre el archivo y accede a su directorio

  3. perl Makefile.PL

  4. make && make test

  5. sudo make install

El módulo RTF::Parser está marcado como obsoleto en CPAN, pero aún hace su trabajo.

#!/usr/local/bin/perl
use strict;
use warnings;
use IO::File;
use File::Basename ();
use File::Spec;
use Cwd ();
use RTF::TEXT::Converter;
our $DEBUG = 0;

{
    our $basedir = Cwd::getcwd;
    foreach my $f ( @ARGV )
    {
        if( $f !~ /\.(textClipping)$/ )
        {
            next;
        }
        if( &convert( File::Spec->rel2abs( $f, $basedir ) ) )
        {
            print( STDOUT "File $f has been successfully converted.\n" );
        }
        else
        {
            print( STDOUT "Failed to convert file $f.\n" );
        }
    }
    exit(0);
}

sub convert
{
    my $file = shift( @_ );
    my( $name, $path, $suffix ) = File::Basename::fileparse( $file, '.textClipping' );
    my $fh = IO::File->new( "${file}/..namedfork/rsrc" ) || do
    {
        print( STDERR "Failed to open resource for file $file: $!\n" );
        return;
    };
    my $data = do{ local $/ = undef; <$fh> };
    $fh->close;
    my $result = '';
    my $p = RTF::TEXT::Converter->new( output => \$result );
    $p->parse_string( $data );
    # A veces, RTF::TEXT::Converter lo hace bien, y a veces hay datos extraños mezclados, por lo que necesitamos limpiarlo.
    if( index( $result, "\0" ) != -1 )
    {
        # say "Data is:\n" . Devel::Hexdump::xd( $result );
        my @parts = split( /\0+/, $result );
        # say "Data is:\n" . Devel::Hexdump::xd( $parts[-1] );
        $result = $parts[-1];
        $result =~ s/^[\x01\xcb]+//;
    }
    print( STDOUT "Saving result to ${path}/${name}.txt\n" ) if( $DEBUG );
    my $out = IO::File->new( ">${path}/${name}.txt" ) || do
    {
        print( STDERR "Unable to open file ${path}/${name}.txt in write mode: $!\n" );
        return;
    };
    $out->autoflush(1);
    $out->print( $result ) || do
    {
        print( STDERR "Unable to write to file ${path}/${name}.txt: $!\n" );
        return;
    };
    $out->close;
    return(1);
}

__END__

Captura de pantalla de MacOSX Automator

Luego, puedes seleccionar uno o varios archivos que terminen con la extensión .textClipping y hacer clic con el botón derecho, en el menú Servicios, seleccionar tu flujo de trabajo Convertir textClipping a texto y esto creará archivos con el mismo nombre base, pero con la extensión .txt.

También puedes guardar este script de perl en un archivo y llamarlo desde la línea de comandos, como rtf2text.pl *.textClipping.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X