diff --git a/QuickLookStephenProject/Info.plist b/QuickLookStephenProject/Info.plist index 51c416a..f8f7578 100644 --- a/QuickLookStephenProject/Info.plist +++ b/QuickLookStephenProject/Info.plist @@ -13,9 +13,106 @@ QLGenerator LSItemContentTypes - public.data + com.apple.applescript.script + com.apple.applescript.text + com.apple.ascii-property-list + com.apple.audio-unit-preset + com.apple.chess.game + com.apple.chess.pgn + com.apple.configprofile + com.apple.configurationprofiles.profile + com.apple.crashreport + com.apple.device-model-code + com.apple.finalcutpro.colorboard + com.apple.finalcutpro.xml + com.apple.gpurestart + com.apple.hangreport + com.apple.haptics.ahap + com.apple.iig-source + com.apple.ips + com.apple.log + com.apple.mobileconfig + com.apple.music.metadata + com.apple.nspboard-type + com.apple.ostype + com.apple.panicreport + com.apple.preference.network + com.apple.provisionprofile + com.apple.rez-source + com.apple.shutdownstall + com.apple.spinreport + com.apple.symbol-export + com.apple.systemprofiler.document + com.apple.terminal.shell-script + com.apple.traditional-mac-plain-text + com.apple.tv.metadata + com.apple.xml-property-list + com.netscape.javascript-source + com.sun.java-source + com.sun.java-web-start + public.ada-source + public.assembly-source + public.bash-script + public.c-header + public.c-plus-plus-header + public.c-plus-plus-inline-header + public.c-plus-plus-source + public.c-plus-plus-source.preprocessed + public.c-source + public.c-source.preprocessed + public.case-insensitive-text + public.comma-separated-values-text public.content + public.csh-script + public.css + public.data + public.delimited-values-text + public.dylan-source + public.filename-extension + public.fortran-77-source + public.fortran-90-source + public.fortran-95-source + public.fortran-source + public.json + public.ksh-script + public.lex-source + public.mig-source + public.mime-type + public.objective-c-plus-plus-source + public.objective-c-plus-plus-source.preprocessed + public.objective-c-source + public.objective-c-source.preprocessed + public.pascal-source + public.patch-file + public.perl-script + public.php-script + public.plain-text + public.precompiled-c-header + public.precompiled-c-plus-plus-header + public.python-script + public.rss + public.rtf + public.ruby-script + public.script + public.shell-script + public.source-code + public.source-code.preprocessed + public.swift-source + public.tab-separated-values-text + public.tcsh-script + public.text public.unix-executable + public.utf16-external-plain-text + public.utf16-plain-text + public.utf8-plain-text + public.utf8-tab-separated-values-text + public.x509-printable-encoded-archive + public.xfd + public.xhtml + public.xml + public.yacc-source + public.yaml + public.zsh-script LSTypeIsPackage diff --git a/find_text_utis.py b/find_text_utis.py new file mode 100644 index 0000000..6b07d23 --- /dev/null +++ b/find_text_utis.py @@ -0,0 +1,72 @@ +"""Script to find all utis & sub-utis conforming to public.text .""" +import os +from itertools import groupby + +LSREGISTER = "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Versions/Current/Support/lsregister" +SEPARATOR = ( + "--------------------------------------------------------------------------------" +) +EXCEPTIONS = [ + "com.apple.mach-o-binary", + "com.apple.structured-text", + "public.3d-content", + "public.calendar-event", + "public.contact", + "public.html", + "public.image", + "public.movie", + "public.playlist", +] + + +def add_keys_recursively(dict, list, key): + """Add values & sub-values from dict of lists, recursively.""" + if key in dict: + for val in dict[key]: + list.append(val) + add_keys_recursively(dict, list, val) + + +os.system(LSREGISTER + " -dump > /tmp/out.txt") +with open("/tmp/out.txt") as f: + dump = list( + list(g) for _, g in groupby(f.read().splitlines(), key=SEPARATOR.__ne__) + )[::2] + +entities = [] +for lines in dump[1:]: + entity = {} + last = None + for line in lines: + data = line.split(":", 1) + if len(data) == 1: + entity[last] += data[0] + else: + entity[data[0]] = data[1] + last = data[0] + if "uti" in entity and "conforms to" in entity: + name = entity["uti"].strip() + type = [x.strip() for x in entity["conforms to"].split(",")] + if name in EXCEPTIONS or any(x in type for x in EXCEPTIONS): + continue + entities.append({"name": name, "type": type}) + +conformed_by = {} +for entity in entities: + for item in entity["type"]: + if item not in conformed_by: + conformed_by[item] = set() + conformed_by[item].add(entity["name"]) + +utis = [ + "public.content", + "public.data", + "public.text", + "public.unix-executable", +] +add_keys_recursively(conformed_by, utis, "public.text") +add_keys_recursively(conformed_by, utis, "public.unix-executable") + +for uti in sorted(set(utis)): + print("\t\t\t\t" + uti + "") +print(len(utis))