aboutsummaryrefslogtreecommitdiffstats
path: root/Source/SPAppController.m
diff options
context:
space:
mode:
authorBibiko <bibiko@eva.mpg.de>2011-01-10 13:05:15 +0000
committerBibiko <bibiko@eva.mpg.de>2011-01-10 13:05:15 +0000
commitf682e2ea9ea4f96b1f395ceb166c7d2a59782c9d (patch)
tree1cc8f4ebe35aced519d45c4d2efa4efa67c9ae5d /Source/SPAppController.m
parenta23577422a8b3e5dade189ce25ab7d8c541c7ca9 (diff)
downloadsequelpro-f682e2ea9ea4f96b1f395ceb166c7d2a59782c9d.tar.gz
sequelpro-f682e2ea9ea4f96b1f395ceb166c7d2a59782c9d.tar.bz2
sequelpro-f682e2ea9ea4f96b1f395ceb166c7d2a59782c9d.zip
• changed sequelpro URL command SyntaxHighlighting to be connection independent - added example BASH script at http://www.sequelpro.com/docs/URL_scheme_sequelpro://_Usage#Use_Sequel_Pro_to_do_a_syntax_highlighting_of_a_given_SQL_query_HTML_formatted
Diffstat (limited to 'Source/SPAppController.m')
-rw-r--r--Source/SPAppController.m137
1 files changed, 137 insertions, 0 deletions
diff --git a/Source/SPAppController.m b/Source/SPAppController.m
index 38d8d54c..0e01c148 100644
--- a/Source/SPAppController.m
+++ b/Source/SPAppController.m
@@ -42,6 +42,19 @@
#import <PSMTabBar/PSMTabBarControl.h>
#import <Sparkle/Sparkle.h>
+#import "SPEditorTokens.h"
+
+#pragma mark lex init
+
+/*
+* Include all the extern variables and prototypes required for flex (used for syntax highlighting)
+*/
+extern NSUInteger yylex();
+extern NSUInteger yyuoffset, yyuleng;
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+void yy_switch_to_buffer(YY_BUFFER_STATE);
+YY_BUFFER_STATE yy_scan_string (const char *);
+
@implementation SPAppController
@synthesize lastBundleBlobFilesDirectory;
@@ -665,6 +678,50 @@
return;
}
+ if([command isEqualToString:@"SyntaxHighlighting"]) {
+
+ BOOL isDir;
+
+ NSString *anUUID = (passedProcessID && [passedProcessID length]) ? passedProcessID : @"";
+ NSString *queryFileName = [NSString stringWithFormat:@"%@%@", SPURLSchemeQueryInputPathHeader, anUUID];
+ NSString *resultFileName = [NSString stringWithFormat:@"%@%@", SPURLSchemeQueryResultPathHeader, anUUID];
+ NSString *metaFileName = [NSString stringWithFormat:@"%@%@", SPURLSchemeQueryResultMetaPathHeader, anUUID];
+ NSString *statusFileName = [NSString stringWithFormat:@"%@%@", SPURLSchemeQueryResultStatusPathHeader, anUUID];
+
+ NSError *inError = nil;
+ NSString *query = [NSString stringWithContentsOfFile:queryFileName encoding:NSUTF8StringEncoding error:inError];
+ NSString *result = @"";
+ NSString *status = @"0";
+
+ if([fm fileExistsAtPath:queryFileName isDirectory:&isDir] && !isDir) {
+
+ if(inError == nil && query && [query length]) {
+ if([parameter count] > 0) {
+ if([[parameter lastObject] isEqualToString:@"html"])
+ result = [NSString stringWithString:[self doSQLSyntaxHighlightForString:query cssLike:NO]];
+ else if([[parameter lastObject] isEqualToString:@"htmlcss"])
+ result = [NSString stringWithString:[self doSQLSyntaxHighlightForString:query cssLike:YES]];
+ }
+ }
+ }
+
+ [fm removeItemAtPath:queryFileName error:nil];
+ [fm removeItemAtPath:resultFileName error:nil];
+ [fm removeItemAtPath:metaFileName error:nil];
+ [fm removeItemAtPath:statusFileName error:nil];
+
+ if(![result writeToFile:resultFileName atomically:YES encoding:NSUTF8StringEncoding error:nil])
+ status = @"1";
+
+ // write status file as notification that query was finished
+ BOOL succeed = [status writeToFile:statusFileName atomically:YES encoding:NSUTF8StringEncoding error:nil];
+ if(!succeed) {
+ NSBeep();
+ SPBeginAlertSheet(NSLocalizedString(@"BASH Error", @"bash error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self parentWindow], self, nil, nil,
+ NSLocalizedString(@"Status file for sequelpro url scheme command couldn't be written!", @"status file for sequelpro url scheme command couldn't be written error message"));
+ }
+ return;
+ }
NSString *activeProcessID = [[[[self frontDocumentWindow] delegate] selectedTableDocument] processID];
@@ -749,6 +806,86 @@
}
+/**
+ * Return an HTML formatted string representing the passed SQL string syntax highlighted
+ */
+- (NSString*)doSQLSyntaxHighlightForString:(NSString*)sqlText cssLike:(BOOL)cssLike
+{
+
+ NSMutableString *sqlHTML = [[[NSMutableString alloc] initWithCapacity:[sqlText length]] autorelease];
+
+ NSRange textRange = NSMakeRange(0, [sqlText length]);
+ NSString *tokenColor;
+ NSString *cssId;
+ size_t token;
+ NSRange tokenRange;
+
+ // initialise flex
+ yyuoffset = 0; yyuleng = 0;
+ yy_switch_to_buffer(yy_scan_string([sqlText UTF8String]));
+ BOOL skipFontTag;
+
+ while (token=yylex()){
+ skipFontTag = NO;
+ switch (token) {
+ case SPT_SINGLE_QUOTED_TEXT:
+ case SPT_DOUBLE_QUOTED_TEXT:
+ tokenColor = @"#A7221C";
+ cssId = @"sp_sql_quoted";
+ break;
+ case SPT_BACKTICK_QUOTED_TEXT:
+ tokenColor = @"#001892";
+ cssId = @"sp_sql_backtick";
+ break;
+ case SPT_RESERVED_WORD:
+ tokenColor = @"#0041F6";
+ cssId = @"sp_sql_keyword";
+ break;
+ case SPT_NUMERIC:
+ tokenColor = @"#67350F";
+ cssId = @"sp_sql_numeric";
+ break;
+ case SPT_COMMENT:
+ tokenColor = @"#265C10";
+ cssId = @"sp_sql_comment";
+ break;
+ case SPT_VARIABLE:
+ tokenColor = @"#6C6C6C";
+ cssId = @"sp_sql_variable";
+ break;
+ case SPT_WHITESPACE:
+ skipFontTag = YES;
+ cssId = @"";
+ break;
+ default:
+ skipFontTag = YES;
+ cssId = @"";
+ }
+
+ tokenRange = NSMakeRange(yyuoffset, yyuleng);
+
+ if(skipFontTag)
+ [sqlHTML appendString:[[sqlText substringWithRange:tokenRange] HTMLEscapeString]];
+ else {
+ if(cssLike)
+ [sqlHTML appendFormat:@"<span class=\"%@\">%@</span>", cssId, [[sqlText substringWithRange:tokenRange] HTMLEscapeString]];
+ else
+ [sqlHTML appendFormat:@"<font color=%@>%@</font>", tokenColor, [[sqlText substringWithRange:tokenRange] HTMLEscapeString]];
+ }
+
+ }
+
+ // Wrap lines, and replace tabs with spaces
+ [sqlHTML replaceOccurrencesOfString:@"\n" withString:@"<br>" options:NSLiteralSearch range:NSMakeRange(0, [sqlHTML length])];
+ [sqlHTML replaceOccurrencesOfString:@"\t" withString:@"&nbsp;&nbsp;&nbsp;&nbsp;" options:NSLiteralSearch range:NSMakeRange(0, [sqlHTML length])];
+
+ if(sqlHTML)
+ return sqlHTML;
+ else
+ return @"";
+
+}
+
- (IBAction)executeBundleItemForApp:(id)sender
{