Skip to content

Instantly share code, notes, and snippets.

@coordt
Last active May 7, 2023 14:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save coordt/f883058e01198eeef5f6e31fa6501154 to your computer and use it in GitHub Desktop.
Save coordt/f883058e01198eeef5f6e31fa6501154 to your computer and use it in GitHub Desktop.
Convert .textClippings into .txt files
"""Convert text clippings to .txt files."""
import os
import re
import subprocess
from pathlib import Path
import plistlib
DEREZ_OUTPUT_RE = re.compile(r"\t\$\"([A-F0-9 ]+)\"\s+/\* (.+?) \*/")
def get_text_from_plist(path: Path) -> str:
"""Get the utf8 text of the plist."""
plist_dict = plistlib.loads(path.read_bytes())
return plist_dict["UTI-Data"]["public.utf8-plain-text"]
def get_text_from_resourcefork(path: Path) -> str:
"""Get the utf8 text from the resource fork."""
cmd = ["DeRez", "-only", "utf8", str(path)]
output = subprocess.run(cmd, capture_output=True)
byte_str = b""
print(output.stdout)
for line in output.stdout.split("\n"):
if match := DEREZ_OUTPUT_RE.match(line):
print("match")
hex_str = match.groups()[0].replace(" ", "")
byte_str += bytes.fromhex(hex_str)
print(byte_str)
return byte_str.decode("utf8")
def convert_file(path: Path):
"""Convert a file."""
new_path = path.with_suffix(".txt")
print(f"Converting {path} to {new_path}")
if os.stat(path).st_size:
# This can be handled with plistlib
text = get_text_from_plist(path)
else:
# this needs DeRez
text = get_text_from_resourcefork(path)
if text:
new_path.write_text(text)
else:
print(f"Did not get text from {path}")
def main(path: Path):
"""Convert the clipping"""
if path.is_dir():
# iterate through the dir
for child in path.iterdir():
if child.is_file() and child.suffix == ".textClipping":
convert_file(child)
elif child.is_dir():
# main(path)
pass
else:
print(f"Skipping file {child}")
elif path.is_file() and path.suffix == ".textClipping":
# process the file
convert_file(path)
else:
print(f"No idea what to do with {path}.")
if __name__ == "__main__":
input_path = Path("/path/to/dir/")
main(input_path)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment