From d92d19069dcd407efdddc6c969c5524d94488e4c Mon Sep 17 00:00:00 2001 From: Bob Rudis Date: Sat, 6 Aug 2016 11:17:28 -0400 Subject: [PATCH] README --- QuickLookR.qlgenerator.zip | Bin 0 -> 7032 bytes QuickLookR.xcodeproj/project.pbxproj | 4 - QuickLookR/GeneratePreviewForURL.m | 47 +++++------ QuickLookR/Info.plist | 8 +- QuickLookR/rdata.h | 148 ----------------------------------- README.md | 7 ++ 6 files changed, 30 insertions(+), 184 deletions(-) create mode 100644 QuickLookR.qlgenerator.zip delete mode 100644 QuickLookR/rdata.h create mode 100644 README.md diff --git a/QuickLookR.qlgenerator.zip b/QuickLookR.qlgenerator.zip new file mode 100644 index 0000000000000000000000000000000000000000..e951de08ec56178f9c2139753f3baf9f15be701f GIT binary patch literal 7032 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 VVPO6UKH$!e_8AobC?fy)^gn+ewr&6b literal 0 HcmV?d00001 diff --git a/QuickLookR.xcodeproj/project.pbxproj b/QuickLookR.xcodeproj/project.pbxproj index d3d5277..27a7227 100644 --- a/QuickLookR.xcodeproj/project.pbxproj +++ b/QuickLookR.xcodeproj/project.pbxproj @@ -11,7 +11,6 @@ C4291BF11D552859001238D2 /* GeneratePreviewForURL.m in Sources */ = {isa = PBXBuildFile; fileRef = C4291BF01D552859001238D2 /* GeneratePreviewForURL.m */; }; C4291BF31D552859001238D2 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = C4291BF21D552859001238D2 /* main.c */; }; C4291BFB1D552C7A001238D2 /* QuickLookR.qlgenerator in CopyFiles */ = {isa = PBXBuildFile; fileRef = C4291BEB1D552859001238D2 /* QuickLookR.qlgenerator */; }; - C4291C171D552E27001238D2 /* rdata.h in Headers */ = {isa = PBXBuildFile; fileRef = C4291C161D552E27001238D2 /* rdata.h */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -33,7 +32,6 @@ C4291BF01D552859001238D2 /* GeneratePreviewForURL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GeneratePreviewForURL.m; sourceTree = ""; }; C4291BF21D552859001238D2 /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = ""; }; C4291BF41D552859001238D2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C4291C161D552E27001238D2 /* rdata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rdata.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -70,7 +68,6 @@ C4291BF01D552859001238D2 /* GeneratePreviewForURL.m */, C4291BF21D552859001238D2 /* main.c */, C4291BF41D552859001238D2 /* Info.plist */, - C4291C161D552E27001238D2 /* rdata.h */, ); path = QuickLookR; sourceTree = ""; @@ -82,7 +79,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - C4291C171D552E27001238D2 /* rdata.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/QuickLookR/GeneratePreviewForURL.m b/QuickLookR/GeneratePreviewForURL.m index ede9621..55fba28 100644 --- a/QuickLookR/GeneratePreviewForURL.m +++ b/QuickLookR/GeneratePreviewForURL.m @@ -4,61 +4,52 @@ #import -#include "rdata.h" +OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, + CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options); -OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options); void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview); -/* ----------------------------------------------------------------------------- - Generate a preview for file - - This function's job is to create preview for designated file - ----------------------------------------------------------------------------- */ - -OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options) -{ +//' This does the hard work +OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, + CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options) { @autoreleasepool { - NSURL *myURL = (__bridge NSURL *)url; + NSURL *myURL = (__bridge NSURL *)url ; - NSString *contents = [ myURL absoluteString ]; + NSString *contents = [ myURL absoluteString ] ; - NSLog(@"generate preview for %@", contents); + NSLog(@"Generating preview for %@", contents) ; - //int pid = [[NSProcessInfo processInfo] processIdentifier]; - NSPipe *pipe = [NSPipe pipe]; - NSFileHandle *file = pipe.fileHandleForReading; + NSPipe *pipe = [ NSPipe pipe ] ; + NSFileHandle *file = pipe.fileHandleForReading ; NSString *cmd = @"rdatainfo::get_info('" ; cmd = [ cmd stringByAppendingString: contents ] ; cmd = [ cmd stringByAppendingString: @"')" ] ; - NSTask *task = [[NSTask alloc] init]; + NSTask *task = [ [ NSTask alloc ] init] ; task.launchPath = @"/usr/local/bin/Rscript"; - task.arguments = @[@"-e", cmd]; + task.arguments = @[ @"-e", cmd ]; task.standardOutput = pipe; [task launch]; - NSData *data = [file readDataToEndOfFile]; - [file closeFile]; + NSData *data = [ file readDataToEndOfFile ] ; + [ file closeFile ]; - NSString *rOutput = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; + NSString *rOutput = [ [ NSString alloc ] initWithData: data encoding: NSUTF8StringEncoding ] ; if (false == QLPreviewRequestIsCancelled(preview)) { QLPreviewRequestSetDataRepresentation(preview, - (__bridge CFDataRef)([rOutput dataUsingEncoding:NSUTF8StringEncoding]), - kUTTypePlainText, - NULL); + (__bridge CFDataRef)([ rOutput dataUsingEncoding:NSUTF8StringEncoding ]), + kUTTypePlainText, NULL) ; } } return noErr; + } -void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview) -{ - // Implement only if supported -} +void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview) { } diff --git a/QuickLookR/Info.plist b/QuickLookR/Info.plist index 13121bf..2967fe8 100644 --- a/QuickLookR/Info.plist +++ b/QuickLookR/Info.plist @@ -17,9 +17,9 @@ public.filename-extension - GGG - RData + rdata rda + rds @@ -38,9 +38,9 @@ public.filename-extension - GGG - RData + rdata rda + rds diff --git a/QuickLookR/rdata.h b/QuickLookR/rdata.h deleted file mode 100644 index ddd75e7..0000000 --- a/QuickLookR/rdata.h +++ /dev/null @@ -1,148 +0,0 @@ - -#include -#include -#include - -typedef enum rdata_type_e { - RDATA_TYPE_STRING, - RDATA_TYPE_INT32, - RDATA_TYPE_REAL, - RDATA_TYPE_LOGICAL, - RDATA_TYPE_TIMESTAMP -} rdata_type_t; - -typedef enum rdata_error_e { - RDATA_OK, - RDATA_ERROR_OPEN = 1, - RDATA_ERROR_SEEK, - RDATA_ERROR_READ, - RDATA_ERROR_MALLOC, - RDATA_ERROR_USER_ABORT, - RDATA_ERROR_PARSE, - RDATA_ERROR_WRITE, - RDATA_ERROR_FACTOR -} rdata_error_t; - -const char *rdata_error_message(rdata_error_t error_code); - -typedef int (*rdata_column_handler)(const char *name, rdata_type_t type, - void *data, long count, void *ctx); -typedef int (*rdata_table_handler)(const char *name, void *ctx); -typedef int (*rdata_text_value_handler)(const char *value, int index, void *ctx); -typedef int (*rdata_column_name_handler)(const char *value, int index, void *ctx); -typedef void (*rdata_error_handler)(const char *error_message, void *ctx); -typedef int (*rdata_progress_handler)(double progress, void *ctx); - -#if defined _WIN32 || defined __CYGWIN__ -typedef _off64_t rdata_off_t; -#elif defined _AIX -typedef off64_t rdata_off_t; -#else -typedef off_t rdata_off_t; -#endif - -typedef enum rdata_io_flags_e { - RDATA_SEEK_SET, - RDATA_SEEK_CUR, - RDATA_SEEK_END -} rdata_io_flags_t; - -typedef int (*rdata_open_handler)(const char *path, void *io_ctx); -typedef int (*rdata_close_handler)(void *io_ctx); -typedef rdata_off_t (*rdata_seek_handler)(rdata_off_t offset, rdata_io_flags_t whence, void *io_ctx); -typedef ssize_t (*rdata_read_handler)(void *buf, size_t nbyte, void *io_ctx); -typedef rdata_error_t (*rdata_update_handler)(long file_size, rdata_progress_handler progress_handler, void *user_ctx, void *io_ctx); - -typedef struct rdata_io_s { - rdata_open_handler open; - rdata_close_handler close; - rdata_seek_handler seek; - rdata_read_handler read; - rdata_update_handler update; - void *io_ctx; - int external_io; -} rdata_io_t; - -typedef struct rdata_parser_s { - rdata_table_handler table_handler; - rdata_column_handler column_handler; - rdata_column_name_handler column_name_handler; - rdata_text_value_handler text_value_handler; - rdata_text_value_handler value_label_handler; - rdata_error_handler error_handler; - rdata_io_t *io; -} rdata_parser_t; - -rdata_parser_t *rdata_parser_init(); -void rdata_parser_free(rdata_parser_t *parser); - -rdata_error_t rdata_set_table_handler(rdata_parser_t *parser, rdata_table_handler table_handler); -rdata_error_t rdata_set_column_handler(rdata_parser_t *parser, rdata_column_handler column_handler); -rdata_error_t rdata_set_column_name_handler(rdata_parser_t *parser, rdata_column_name_handler column_name_handler); -rdata_error_t rdata_set_text_value_handler(rdata_parser_t *parser, rdata_text_value_handler text_value_handler); -rdata_error_t rdata_set_value_label_handler(rdata_parser_t *parser, rdata_text_value_handler value_label_handler); -rdata_error_t rdata_set_error_handler(rdata_parser_t *parser, rdata_error_handler error_handler); -rdata_error_t rdata_set_open_handler(rdata_parser_t *parser, rdata_open_handler open_handler); -rdata_error_t rdata_set_close_handler(rdata_parser_t *parser, rdata_close_handler close_handler); -rdata_error_t rdata_set_seek_handler(rdata_parser_t *parser, rdata_seek_handler seek_handler); -rdata_error_t rdata_set_read_handler(rdata_parser_t *parser, rdata_read_handler read_handler); -rdata_error_t rdata_set_update_handler(rdata_parser_t *parser, rdata_update_handler update_handler); -rdata_error_t rdata_set_io_ctx(rdata_parser_t *parser, void *io_ctx); -/* rdata_parse works on RData and RDS. The table handler will be called once - * per data frame in RData files, and zero times on RDS files. */ -rdata_error_t rdata_parse(rdata_parser_t *parser, const char *filename, void *user_ctx); - - -// Write API -typedef ssize_t (*rdata_data_writer)(const void *data, size_t len, void *ctx); - -typedef struct rdata_column_s { - rdata_type_t type; - int index; - char name[256]; - char label[1024]; - - int32_t factor_count; - const char **factor; -} rdata_column_t; - -typedef struct rdata_writer_s { - rdata_data_writer data_writer; - size_t bytes_written; - - rdata_error_handler error_handler; - void *user_ctx; - - void *atom_table; - int bswap; - - rdata_column_t **columns; - int32_t columns_count; - int32_t columns_capacity; - - int32_t row_count; -} rdata_writer_t; - -rdata_writer_t *rdata_writer_init(rdata_data_writer write_callback); -void rdata_writer_free(rdata_writer_t *writer); - -rdata_column_t *rdata_add_column(rdata_writer_t *writer, const char *name, rdata_type_t type); - -rdata_error_t rdata_column_set_label(rdata_column_t *column, const char *label); -rdata_error_t rdata_column_add_factor(rdata_column_t *column, const char *factor); - -rdata_column_t *rdata_get_column(rdata_writer_t *writer, int32_t j); - -rdata_error_t rdata_begin_file(rdata_writer_t *writer, void *ctx); -rdata_error_t rdata_begin_table(rdata_writer_t *writer, const char *variable_name, int32_t row_count); -rdata_error_t rdata_begin_column(rdata_writer_t *writer, rdata_column_t *column); - -rdata_error_t rdata_append_real_value(rdata_writer_t *writer, double value); -rdata_error_t rdata_append_int32_value(rdata_writer_t *writer, int32_t value); -rdata_error_t rdata_append_timestamp_value(rdata_writer_t *writer, time_t value); -rdata_error_t rdata_append_logical_value(rdata_writer_t *writer, int value); -rdata_error_t rdata_append_string_value(rdata_writer_t *writer, const char *value); - -rdata_error_t rdata_end_column(rdata_writer_t *writer, rdata_column_t *column); -rdata_error_t rdata_end_table(rdata_writer_t *writer, const char *datalabel); -rdata_error_t rdata_end_file(rdata_writer_t *writer); diff --git a/README.md b/README.md new file mode 100644 index 0000000..1a6422c --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +This is a macOS QuickLook Plugin for R data files. + +That means if you install this plugin (download and unzip `QuickLookR.qlgenerator.zip` and put `QuickLookR.qlgenerator` into `~/Library/QuickLook`) you can hit the spacebar on an R Data or saved RDS file (`.rdata`, `.rda`, `.rds` are currently supported extensions) and get a `str()` preview without firing up R/RStudio. + +It looks for `Rscript` in `/usr/local/bin` and (for now) requires a helper package [`rdatainfo`](https://github.com/hrbrmstr/rdatainfo). `devtools::install_github("hrbrmstr/rdatainfo")` to install that. + +For the moment, the QuickLook preview is rather plain, but I hope to improve the output and switch to reading the data files at the C-level by linking directly to `R.framework`.