diff --git a/Makefile b/Makefile
index 2b844d2..748eabe 100644
--- a/Makefile
+++ b/Makefile
@@ -18,3 +18,4 @@ after-install::
install.exec "killall -9 Apollo"
install.exec "killall -9 narwhal"
install.exec "killall -9 AlienBlue"
+ install.exec "killall -9 Slide\ for\ Reddit"
diff --git a/layout/var/mobile/Library/Application Support/TFDidThatSay/eye160white.png b/layout/var/mobile/Library/Application Support/TFDidThatSay/eye160white.png
new file mode 100644
index 0000000..991d5d0
Binary files /dev/null and b/layout/var/mobile/Library/Application Support/TFDidThatSay/eye160white.png differ
diff --git a/prefs/Resources/Root.plist b/prefs/Resources/Root.plist
index fee1061..b8322ce 100644
--- a/prefs/Resources/Root.plist
+++ b/prefs/Resources/Root.plist
@@ -68,11 +68,25 @@
label
Enable Alien Blue
+
+ PostNotification
+ com.lint.undelete.prefs.changed
+ cell
+ PSSwitchCell
+ default
+
+ defaults
+ com.lint.undelete.prefs
+ key
+ isSlideEnabled
+ label
+ Enable Slide
+
cell
PSGroupCell
footerText
- On apps that have the eye button rather than in the menu, enable or disable that button from appearing on only deleted comments/posts.
+ On apps that have an eye button rather than an option in the menu, enable or disable that button from appearing on only deleted comments/posts.
label
visibility
@@ -88,7 +102,7 @@
key
isApolloDeletedCommentsOnly
label
- Apollo | Only on deleted comments
+ Apollo | Deleted only
PostNotification
@@ -102,7 +116,21 @@
key
isAlienBlueDeletedOnly
label
- Alien Blue | Only on deleted comments/posts
+ Alien Blue | Deleted only
+
+
+ PostNotification
+ com.lint.undelete.prefs.changed
+ cell
+ PSSwitchCell
+ default
+
+ defaults
+ com.lint.undelete.prefs
+ key
+ isSlideDeletedOnly
+ label
+ Slide | Deleted only
cell
diff --git a/tfdidthatsay.plist b/tfdidthatsay.plist
index 6b4dd14..7858aec 100644
Binary files a/tfdidthatsay.plist and b/tfdidthatsay.plist differ
diff --git a/tweak/Slide.h b/tweak/Slide.h
new file mode 100644
index 0000000..88e0ad9
--- /dev/null
+++ b/tweak/Slide.h
@@ -0,0 +1,44 @@
+
+/* -- Comment Interfaces -- */
+
+@interface RComment
+@property(strong, nonatomic) NSString *subreddit;
+@property(strong, nonatomic) NSString *author;
+@property(strong, nonatomic) NSString *body;
+@property(strong, nonatomic) NSString *id;
+@end
+
+@interface CommentDepthCell
+-(void) showMenu:(id) arg1;
+
+//custom elements
+-(void) addUndeleteButtonToMenu;
+@end
+
+/* -- Utility Interfaces -- */
+
+@interface UIColor ()
++(UIColor *) colorWithHex:(NSString *) arg1;
+-(NSString *) hexString;
+@end
+
+@interface NSAttributedString ()
+-(void) yy_setTextHighlightRange:(NSRange) range color:(UIColor *) color backgroundColor:(UIColor *) backgroundColor userInfo:(NSDictionary *) userInfo;
+@end
+
+@interface ColorUtil : NSObject
++(UIColor *) accentColorForSub:(NSString *) arg1;
++(UIColor *) fontColorForTheme:(NSString *) arg1;
++(UIColor *) backgroundColorForTheme:(NSString *) arg1;
+@end
+
+@interface DTHTMLAttributedStringBuilder
+-(id) initWithHTML:(NSData *)data options:(NSDictionary *)options documentAttributes:(NSDictionary * __autoreleasing*)docAttributes;
+-(NSAttributedString *) generatedAttributedString;
+@end
+
+@interface FontGenerator : NSObject
++(UIFont *) fontOfSize:(CGFloat) arg1 submission:(BOOL) arg2 willOffset:(BOOL) arg3;
++(UIFont *) boldFontOfSize:(CGFloat) arg1 submission:(BOOL) arg2 willOffset:(BOOL) arg3;
++(UIFont *) italicFontOfSize:(CGFloat) arg1 submission:(BOOL) arg2 willOffset:(BOOL) arg3;
+@end
\ No newline at end of file
diff --git a/tweak/Slide.xm b/tweak/Slide.xm
new file mode 100644
index 0000000..851c571
--- /dev/null
+++ b/tweak/Slide.xm
@@ -0,0 +1,469 @@
+
+#import "Slide.h"
+#import "assets/MMMarkdown.h"
+
+static BOOL isSlideEnabled;
+static BOOL isSlideDeletedOnly;
+static CGFloat pushshiftRequestTimeoutValue;
+
+%group Slide
+
+@implementation FontGenerator
+
++(UIFont *) fontOfSize:(CGFloat) size submission:(BOOL) isSubmission willOffset:(BOOL) willOffset{
+ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
+
+ NSString *fontName;
+ CGFloat fontSize = size;
+
+ if (willOffset){
+ if (isSubmission){
+ fontSize += ([userDefaults objectForKey:@"POST_FONT_SIZE"] == nil) ? 0 : [userDefaults integerForKey:@"POST_FONT_SIZE"];
+ } else {
+ fontSize += ([userDefaults objectForKey:@"COMMENT_FONT_SIZE"] == nil) ? -2 : [userDefaults integerForKey:@"COMMENT_FONT_SIZE"];
+ }
+ }
+
+ if ([userDefaults stringForKey:(isSubmission ? @"postfont" : @"commentfont")] == nil){
+ fontName = isSubmission ? @"AvenirNext-DemiBold" : @"AvenirNext-Medium";
+ } else {
+ fontName = [userDefaults stringForKey:(isSubmission ? @"postfont" : @"commentfont")];
+ }
+
+ UIFont *font = [UIFont fontWithName:fontName size:fontSize];
+
+ if (!font){
+ font = [UIFont systemFontOfSize:fontSize];
+ }
+
+ return font;
+}
+
++(UIFont *) boldFontOfSize:(CGFloat) size submission:(BOOL) isSubmission willOffset:(BOOL) willOffset {
+ UIFont *font = [self fontOfSize:size submission:isSubmission willOffset:willOffset];
+
+ if ([font.fontName isEqualToString:[UIFont systemFontOfSize:10].fontName]){
+ return [UIFont boldSystemFontOfSize:font.pointSize];
+ } else {
+ UIFontDescriptor *desc = [font.fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];
+
+ if (desc == nil){
+ return font;
+ } else {
+ return [UIFont fontWithDescriptor:desc size: 0];
+ }
+ }
+}
+
++(UIFont *) italicFontOfSize:(CGFloat) size submission:(BOOL) isSubmission willOffset:(BOOL) willOffset {
+ UIFont *font = [self fontOfSize:size submission:isSubmission willOffset:willOffset];
+
+ if ([font.fontName isEqualToString:[UIFont systemFontOfSize:10].fontName]){
+ return [UIFont italicSystemFontOfSize:font.pointSize];
+ } else {
+ UIFontDescriptor *desc = [font.fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];
+
+ if (desc == nil){
+ return font;
+ } else {
+ return [UIFont fontWithDescriptor:desc size: 0];
+ }
+ }
+}
+
+@end
+
+
+@implementation ColorUtil
+
++(UIColor *) accentColorForSub:(NSString *) subreddit{
+ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
+ NSData *colorData = [userDefaults dataForKey:[NSString stringWithFormat:@"accent+%@", subreddit]];
+ UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
+ if (color) {
+ return color;
+ } else {
+ UIColor *baseAccentColor = [NSKeyedUnarchiver unarchiveObjectWithData:[userDefaults dataForKey:@"accentcolor"]];
+
+ if (baseAccentColor){
+ return baseAccentColor;
+ } else {
+ return [UIColor colorWithRed:0.161 green:0.475 blue:1.0 alpha:1.0];
+ }
+ }
+}
+
++(UIColor *) fontColorForTheme:(NSString *)theme{
+ UIColor *fontColor;
+ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
+
+ //if only switch blocks worked with strings...
+ if ([theme isEqualToString:@"light"]) {
+ fontColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.87];
+ } else if ([theme isEqualToString:@"dark"]) {
+ fontColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.87];
+ } else if ([theme isEqualToString:@"black"]) {
+ fontColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.87];
+ } else if ([theme isEqualToString:@"blue"]) {
+ fontColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.87];
+ } else if ([theme isEqualToString:@"sepia"]) {
+ fontColor = [UIColor colorWithRed:0.243 green:.239 blue:.212 alpha:0.87];
+ } else if ([theme isEqualToString:@"red"]) {
+ fontColor = [UIColor colorWithRed:1.0 green:0.969 blue:0.929 alpha:0.87];
+ } else if ([theme isEqualToString:@"deep"]) {
+ fontColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.87];
+ } else if ([theme isEqualToString:@"mint"]) {
+ fontColor = [UIColor colorWithRed:0.035 green:0.212 blue:0.059 alpha:0.87];
+ } else if ([theme isEqualToString:@"cream"]) {
+ fontColor = [UIColor colorWithRed:0.267 green:0.255 blue:0.224 alpha:0.87];
+ } else if ([theme isEqualToString:@"acontrast"]) {
+ fontColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.87];
+ } else if ([theme isEqualToString:@"pink"]) {
+ fontColor = [UIColor colorWithRed:0.149 green:0.157 blue:0.267 alpha:0.87];
+ } else if ([theme isEqualToString:@"solarize"]) {
+ fontColor = [UIColor colorWithRed:0.514 green:0.580 blue:0.588 alpha:0.87];
+ } else if (!theme) {
+ fontColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.87];
+ } else {
+ NSString *customThemeString = [[userDefaults stringForKey:[NSString stringWithFormat:@"Theme+%@", theme]] stringByRemovingPercentEncoding];
+ if (customThemeString) {
+ NSString *customFontColorHex = [customThemeString componentsSeparatedByString:@"#"][4];
+ fontColor = [UIColor colorWithHex:customFontColorHex];
+ } else {
+ fontColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.87];
+ }
+ }
+
+ return fontColor;
+}
+
++(UIColor *) backgroundColorForTheme:(NSString *) theme{
+ UIColor *backgroundColor;
+ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
+
+ if ([theme isEqualToString:@"light"]) {
+ backgroundColor = [UIColor colorWithRed:0.352 green:0.352 blue:0.352 alpha:1.0];
+ } else if ([theme isEqualToString:@"dark"]) {
+ backgroundColor = [UIColor colorWithRed:0.051 green:0.051 blue:0.051 alpha:1.0];
+ } else if ([theme isEqualToString:@"black"]) {
+ backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1.0];
+ } else if ([theme isEqualToString:@"blue"]) {
+ backgroundColor = [UIColor colorWithRed:0.071 green:0.094 blue:0.106 alpha:1.0];
+ } else if ([theme isEqualToString:@"sepia"]) {
+ backgroundColor = [UIColor colorWithRed:0.310 green:0.302 blue:0.267 alpha:1.0];
+ } else if ([theme isEqualToString:@"red"]) {
+ backgroundColor = [UIColor colorWithRed:0.075 green:0.055 blue:0.051 alpha:1.0];
+ } else if ([theme isEqualToString:@"deep"]) {
+ backgroundColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.043 alpha:1.0];
+ } else if ([theme isEqualToString:@"mint"]) {
+ backgroundColor = [UIColor colorWithRed:0.364 green:0.376 blue:0.357 alpha:1.0];
+ } else if ([theme isEqualToString:@"cream"]) {
+ backgroundColor = [UIColor colorWithRed:0.322 green:0.314 blue:0.286 alpha:1.0];
+ } else if ([theme isEqualToString:@"acontrast"]) {
+ backgroundColor = [UIColor colorWithRed:0.027 green:0.027 blue:0.24 alpha:1.0];
+ } else if ([theme isEqualToString:@"pink"]) {
+ backgroundColor = [UIColor colorWithRed:1.0 green:0.376 blue:0.357 alpha:1.0];
+ } else if ([theme isEqualToString:@"solarize"]) {
+ backgroundColor = [UIColor colorWithRed:0.040 green:0.067 blue:0.082 alpha:1.0];
+ } else if (!theme) {
+ backgroundColor = [UIColor colorWithRed:0.352 green:0.352 blue:0.352 alpha:1.0];
+ } else {
+ NSString *customThemeString = [[userDefaults stringForKey:[NSString stringWithFormat:@"Theme+%@", theme]] stringByRemovingPercentEncoding];
+ if (customThemeString) {
+ NSString *customFontColorHex = [customThemeString componentsSeparatedByString:@"#"][3];
+ backgroundColor = [UIColor colorWithHex:customFontColorHex];
+ } else {
+ backgroundColor = [UIColor colorWithRed:0.352 green:0.352 blue:0.352 alpha:1.0];
+ }
+ }
+
+ return backgroundColor;
+}
+
+@end
+
+
+static UIButton * createUndeleteButton(){
+
+ UIButton *undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom];
+ UIImage *undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160white.png"];
+
+ UIGraphicsBeginImageContextWithOptions(CGSizeMake(20, 20), NO, 0);
+ [undeleteImage drawInRect:CGRectMake(0, 0, 20, 20)];
+ undeleteImage = UIGraphicsGetImageFromCurrentImageContext();
+ UIGraphicsEndImageContext();
+
+ UIGraphicsBeginImageContextWithOptions(CGSizeMake(35, 35), NO, 0);
+ CGContextRef context = UIGraphicsGetCurrentContext();
+ UIGraphicsPushContext(context);
+ [undeleteImage drawAtPoint:CGPointMake(7.5, 7.5)];
+ UIGraphicsPopContext();
+ undeleteImage = UIGraphicsGetImageFromCurrentImageContext();
+ UIGraphicsEndImageContext();
+
+ [undeleteButton setImage:undeleteImage forState:UIControlStateNormal];
+ undeleteButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
+
+ return undeleteButton;
+}
+
+
+//because it wont compile without this
+%hook RComment
+%end
+
+
+%hook UIColor
+
+%new
++(UIColor *) colorWithHex:(NSString *) arg1 {
+ if (!arg1){
+ NSString *firstChar = [arg1 substringToIndex:1];
+ if ([firstChar isEqualToString:@"#"]){
+ arg1 = [arg1 substringWithRange:NSMakeRange(1, [arg1 length]-1)];
+ }
+
+ unsigned rgbValue = 0;
+ NSScanner *scanner = [NSScanner scannerWithString:arg1];
+ [scanner scanHexInt:&rgbValue];
+
+ return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:0.87];
+ } else {
+ return nil;
+ }
+}
+
+%new
+-(NSString *) hexString {
+ const CGFloat *components = CGColorGetComponents(self.CGColor);
+
+ CGFloat r = components[0];
+ CGFloat g = components[1];
+ CGFloat b = components[2];
+
+ return [NSString stringWithFormat:@"#%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255)];
+}
+
+%end
+
+
+%hook CommentDepthCell
+
+-(void) doShortClick{
+ %orig;
+
+ [self addUndeleteButtonToMenu];
+}
+
+-(void) doLongClick {
+ %orig;
+
+ [self addUndeleteButtonToMenu];
+}
+
+%new
+-(void) addUndeleteButtonToMenu{
+
+ NSString *body = [MSHookIvar(self, "comment") body];
+
+ if ((isSlideDeletedOnly && ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"])) || !isSlideDeletedOnly){
+
+ id controller = MSHookIvar(self, "parent");
+
+ if (MSHookIvar(controller, "menuCell")){
+
+ UIStackView *menu = MSHookIvar(self, "menu");
+
+ if (![[[[menu arrangedSubviews] lastObject] actionsForTarget:self forControlEvent:UIControlEventTouchUpInside] containsObject:@"handleUndeleteComment:"]){
+ UIButton *undeleteButton = createUndeleteButton();
+ [undeleteButton addTarget:self action:@selector(handleUndeleteComment:) forControlEvents:UIControlEventTouchUpInside];
+
+ [menu addArrangedSubview:undeleteButton];
+ }
+ }
+ }
+}
+
+%new
+-(void) handleUndeleteComment:(id) sender{
+
+ [sender setEnabled:NO];
+
+ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
+ id textStackDisplayView = MSHookIvar(self, "commentBody");
+ id comment = MSHookIvar(self, "comment");
+
+ NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
+ NSOperationQueue *queue = [[NSOperationQueue alloc] init];
+
+ [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api.pushshift.io/reddit/search/comment/?ids=%@&fields=author,body",[[comment id] componentsSeparatedByString:@"_"][1]]]];
+ [request setHTTPMethod:@"GET"];
+ [request setTimeoutInterval:pushshiftRequestTimeoutValue];
+
+ [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
+
+ NSString *author = @"[author]";
+ NSString *body = @"[body]";
+
+ if (data != nil && error == nil){
+ id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
+ if ([[jsonData objectForKey:@"data"] count] != 0){
+ author = [[jsonData objectForKey:@"data"][0] objectForKey:@"author"];
+ body = [[jsonData objectForKey:@"data"][0] objectForKey:@"body"];
+ if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){
+ body = @"[pushshift was unable to archive this]";
+ }
+ } else {
+ body = @"[pushshift has not archived this yet]";
+ }
+ } else if (error != nil || data == nil){
+ body = [NSString stringWithFormat:@"[an error occured while attempting to contact pushshift api (%@)]", [error localizedDescription]];
+ }
+
+ //Attributed string generation rewrote from Slide_for_Reddit.TextDisplayStackView.createAttributedChunk(...)
+
+ UIFont *font = [%c(FontGenerator) fontOfSize:MSHookIvar(textStackDisplayView, "fontSize") submission:NO willOffset:YES];
+
+ NSString *themeName = [userDefaults stringForKey:@"theme"];
+ UIColor *fontColor = [%c(ColorUtil) fontColorForTheme:themeName];
+ UIColor *accentColor = [%c(ColorUtil) accentColorForSub:[comment subreddit]];
+
+ NSString *html = [%c(MMMarkdown) HTMLStringWithMarkdown:body extensions:MMMarkdownExtensionsGitHubFlavored error:nil];
+ html = [[html stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""];
+ html = [[html stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"" withString:@""];
+ html = [[html stringByReplacingOccurrencesOfString:@"" withString:@""] stringByReplacingOccurrencesOfString:@"
" withString:@""];
+ html = [html stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
+
+ DTHTMLAttributedStringBuilder *dthtmlBuilder = [[%c(DTHTMLAttributedStringBuilder) alloc] initWithHTML:[html dataUsingEncoding:NSUTF8StringEncoding] options:@{@"DTUseiOS6Attributes": @YES, @"DTDefaultTextColor": fontColor, @"DTDefaultFontSize": @([font pointSize])} documentAttributes:nil];
+
+ NSMutableAttributedString *htmlAttributedString = [[NSMutableAttributedString alloc] initWithAttributedString:[dthtmlBuilder generatedAttributedString]];
+ NSRange htmlStringRange = NSMakeRange(0, [htmlAttributedString length]);
+
+ [[htmlAttributedString mutableString] replaceOccurrencesOfString:@"\t•\t" withString:@" • " options:nil range: htmlStringRange];
+ [[htmlAttributedString mutableString] replaceOccurrencesOfString:@"\t◦\t" withString:@" ◦ " options:nil range: htmlStringRange];
+ [[htmlAttributedString mutableString] replaceOccurrencesOfString:@"\t▪\t" withString:@" ▪ " options:nil range: htmlStringRange];
+
+ [htmlAttributedString removeAttribute:@"CTForegroundColorFromContext" range:htmlStringRange];
+
+ [htmlAttributedString enumerateAttributesInRange:htmlStringRange options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(NSDictionary *attributes, NSRange range, BOOL *stop) {
+ for (NSString *key in attributes){
+
+ if ([(UIColor *) attributes[key] isKindOfClass:[UIColor class]]){
+ UIColor *attrColor = (UIColor *) attributes[key];
+ if ([[attrColor hexString] isEqualToString:@"#0000FF"]){
+ UIFont *tempFont = [UIFont fontWithName:@"Courier" size:font.pointSize];
+
+ [htmlAttributedString setAttributes:@{NSForegroundColorAttributeName: accentColor, NSBackgroundColorAttributeName: [%c(ColorUtil) backgroundColorForTheme:themeName], NSFontAttributeName: (tempFont ? tempFont : font)} range:range];
+ } else if ([[attrColor hexString] isEqualToString:@"#008000"]) {
+ [htmlAttributedString setAttributes:@{NSForegroundColorAttributeName: fontColor, NSFontAttributeName:font} range:range];
+ }
+ } else if ([(NSURL *) attributes[key] isKindOfClass:[NSURL class]]){
+ NSURL *attrUrl = (NSURL *)attributes[key];
+
+ if (([userDefaults objectForKey:@"ENLARGE_LINKS"] == nil) ? YES : [userDefaults boolForKey:@"ENLARGE_LINKS"]){
+ [htmlAttributedString addAttribute:NSFontAttributeName value:[%c(FontGenerator) boldFontOfSize:18 submission:NO willOffset:YES] range:range];
+ }
+
+ [htmlAttributedString addAttribute:NSForegroundColorAttributeName value:accentColor range:range];
+ [htmlAttributedString addAttribute:NSUnderlineColorAttributeName value:[UIColor clearColor] range:range];
+
+ //skipping showLinkContentType b/c not necessary and spoilers b/c MMMarkdown doesn't support them
+
+ [htmlAttributedString yy_setTextHighlightRange:range color: accentColor backgroundColor:nil userInfo:@{@"url": attrUrl}];
+ break;
+ }
+ }
+ }];
+
+ [htmlAttributedString beginEditing];
+ [htmlAttributedString enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, [htmlAttributedString length]) options:nil usingBlock:^(id value, NSRange range, BOOL *stop){
+
+ UIFont *attrFont = (UIFont *)value;
+
+ BOOL isBold = (attrFont.fontDescriptor.symbolicTraits & UIFontDescriptorTraitBold) != 0;
+ BOOL isItalic = (attrFont.fontDescriptor.symbolicTraits & UIFontDescriptorTraitItalic) != 0;
+
+ UIFont *newFont = font;
+
+ if (isBold){
+ newFont = [%c(FontGenerator) boldFontOfSize:attrFont.pointSize submission:NO willOffset:NO];
+ } else if (isItalic){
+ newFont = [%c(FontGenerator) italicFontOfSize:attrFont.pointSize submission:NO willOffset:NO];
+ }
+
+ [htmlAttributedString removeAttribute:NSFontAttributeName range:range];
+ [htmlAttributedString addAttribute:NSFontAttributeName value:newFont range:range];
+
+ }];
+ [htmlAttributedString endEditing];
+
+ NSMutableAttributedString *newCommentText = [MSHookIvar(self, "cellContent") initWithAttributedString:htmlAttributedString];
+ NSAttributedString *tempAttributedString = [[NSAttributedString alloc] initWithString:@""];
+ [newCommentText appendAttributedString:tempAttributedString]; //to keep the compiler happy
+
+ [comment setAuthor:author];
+ [comment setBody:body];
+
+ id controller = MSHookIvar(self, "parent");
+
+ [self performSelectorOnMainThread:@selector(showMenu:) withObject:nil waitUntilDone:YES];
+ [MSHookIvar(controller, "tableView") performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
+
+ [sender setEnabled:YES];
+ }];
+}
+
+%end
+
+%end
+
+
+static void loadPrefs(){
+ NSMutableDictionary *prefs = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/User/Library/Preferences/com.lint.undelete.prefs.plist"];
+
+ if (prefs){
+
+ if ([prefs objectForKey:@"isSlideEnabled"] != nil){
+ isSlideEnabled = [[prefs objectForKey:@"isSlideEnabled"] boolValue];
+ } else {
+ isSlideEnabled = YES;
+ }
+
+ if ([prefs objectForKey:@"isSlideDeletedOnly"] != nil){
+ isSlideDeletedOnly = [[prefs objectForKey:@"isSlideDeletedOnly"] boolValue];
+ } else {
+ isSlideDeletedOnly = YES;
+ }
+
+ if ([prefs objectForKey:@"requestTimeoutValue"] != nil){
+ pushshiftRequestTimeoutValue = [[prefs objectForKey:@"requestTimeoutValue"] doubleValue];
+ } else {
+ pushshiftRequestTimeoutValue = 10;
+ }
+
+ } else {
+ isSlideEnabled = YES;
+ isSlideDeletedOnly = YES;
+ pushshiftRequestTimeoutValue = 10;
+ }
+}
+
+static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
+ loadPrefs();
+}
+
+
+%ctor {
+ loadPrefs();
+
+ NSString* processName = [[NSProcessInfo processInfo] processName];
+
+ if ([processName isEqualToString:@"Slide for Reddit"]){
+ if (isSlideEnabled){
+
+ CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
+
+ %init(Slide, CommentDepthCell = objc_getClass("Slide_for_Reddit.CommentDepthCell"), RComment = objc_getClass("Slide_for_Reddit.RSubmission"));
+ }
+ }
+}