feat: QLOPML extension
This commit is contained in:
21
QLOPML/Base.lproj/PreviewViewController.xib
Normal file
21
QLOPML/Base.lproj/PreviewViewController.xib
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11762" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="macosx"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11762"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<objects>
|
||||||
|
<customObject id="-2" userLabel="File's Owner" customClass="PreviewViewController" customModuleProvider="">
|
||||||
|
<connections>
|
||||||
|
<outlet property="view" destination="c22-O7-iKe" id="NRM-P4-wb6"/>
|
||||||
|
</connections>
|
||||||
|
</customObject>
|
||||||
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
|
<customView id="c22-O7-iKe" userLabel="Preview View">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
|
</customView>
|
||||||
|
</objects>
|
||||||
|
</document>
|
||||||
44
QLOPML/Info.plist
Normal file
44
QLOPML/Info.plist
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
|
<key>CFBundleDisplayName</key>
|
||||||
|
<string>QLOPML</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>$(MARKETING_VERSION)</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||||
|
<key>LSMinimumSystemVersion</key>
|
||||||
|
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
||||||
|
<key>NSExtension</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSExtensionAttributes</key>
|
||||||
|
<dict>
|
||||||
|
<key>QLSupportedContentTypes</key>
|
||||||
|
<array>
|
||||||
|
<string>org.opml.opml</string>
|
||||||
|
</array>
|
||||||
|
<key>QLSupportsSearchableItems</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<key>NSExtensionPointIdentifier</key>
|
||||||
|
<string>com.apple.quicklook.preview</string>
|
||||||
|
<key>NSExtensionPrincipalClass</key>
|
||||||
|
<string>PreviewViewController</string>
|
||||||
|
</dict>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string>Copyright © 2025 relikd.</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
5
QLOPML/PreviewViewController.h
Normal file
5
QLOPML/PreviewViewController.h
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
@interface PreviewViewController : NSViewController
|
||||||
|
|
||||||
|
@end
|
||||||
27
QLOPML/PreviewViewController.m
Normal file
27
QLOPML/PreviewViewController.m
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#import "PreviewViewController.h"
|
||||||
|
#import <Quartz/Quartz.h>
|
||||||
|
#import <WebKit/WebKit.h>
|
||||||
|
#include "opml-lib.h"
|
||||||
|
|
||||||
|
@interface PreviewViewController () <QLPreviewingController>
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation PreviewViewController
|
||||||
|
|
||||||
|
- (NSString *)nibName {
|
||||||
|
return @"PreviewViewController";
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)preparePreviewOfFileAtURL:(NSURL *)url completionHandler:(void (^)(NSError * _Nullable))handler {
|
||||||
|
NSData *data = generateHTMLData(url, [NSBundle mainBundle], NO);
|
||||||
|
// sure, we could use `WKWebView`, but that requires the `com.apple.security.network.client` entitlement
|
||||||
|
WebView *web = [[WebView alloc] initWithFrame:self.view.bounds];
|
||||||
|
web.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
|
||||||
|
[self.view addSubview:web];
|
||||||
|
// [web.mainFrame loadHTMLString:html baseURL:nil];
|
||||||
|
[web.mainFrame loadData:data MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:nil];
|
||||||
|
handler(nil);
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
10
QLOPML/QLOPML.entitlements
Normal file
10
QLOPML/QLOPML.entitlements
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>com.apple.security.app-sandbox</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.files.user-selected.read-only</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
7
QLOPML/opml-lib.h
Normal file
7
QLOPML/opml-lib.h
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#ifndef opml_lib_h
|
||||||
|
#define opml_lib_h
|
||||||
|
|
||||||
|
NSData* generateHTMLData(NSURL *url, NSBundle *bundle, BOOL thumb);
|
||||||
|
//void renderThumbnail(CFURLRef url, CFBundleRef bundle, CGContextRef context, CGSize maxSize);
|
||||||
|
|
||||||
|
#endif /* opml_lib_h */
|
||||||
116
QLOPML/opml-lib.m
Normal file
116
QLOPML/opml-lib.m
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <AppKit/AppKit.h>
|
||||||
|
//#import <WebKit/WebKit.h>
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// |
|
||||||
|
// | OPML renderer
|
||||||
|
// |
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
|
||||||
|
NSXMLElement* make(NSString *tag, NSString *text, NSXMLElement *parent) {
|
||||||
|
NSXMLElement *div = [NSXMLElement elementWithName:tag];
|
||||||
|
if (text) div.stringValue = text;
|
||||||
|
[parent addChild:div];
|
||||||
|
return div;
|
||||||
|
}
|
||||||
|
|
||||||
|
void attribute(NSXMLElement *parent, NSString *key, NSString *value) {
|
||||||
|
[parent addAttribute:[NSXMLElement attributeWithName:key stringValue:value]];
|
||||||
|
}
|
||||||
|
|
||||||
|
NSXMLElement* section(NSString *title, NSString *container, NSXMLElement *parent) {
|
||||||
|
make(@"h3", title, parent);
|
||||||
|
NSXMLElement *div = make(container, nil, parent);
|
||||||
|
attribute(div, @"class", @"section");
|
||||||
|
return div;
|
||||||
|
}
|
||||||
|
|
||||||
|
void appendNode(NSXMLElement *child, NSXMLElement *parent, Boolean thumb) {
|
||||||
|
|
||||||
|
if ([child.name isEqualToString:@"head"]) {
|
||||||
|
if (thumb)
|
||||||
|
return;
|
||||||
|
NSXMLElement *dl = section(@"Metadata:", @"dl", parent);
|
||||||
|
for (NSXMLElement *head in child.children) {
|
||||||
|
make(@"dt", head.name, dl);
|
||||||
|
make(@"dd", head.stringValue, dl);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ([child.name isEqualToString:@"body"]) {
|
||||||
|
parent = thumb ? make(@"ul", nil, parent) : section(@"Content:", @"ul", parent);
|
||||||
|
|
||||||
|
} else if ([child.name isEqualToString:@"outline"]) {
|
||||||
|
if ([child attributeForName:@"separator"].stringValue) {
|
||||||
|
make(@"hr", nil, parent);
|
||||||
|
} else {
|
||||||
|
NSString *desc = [child attributeForName:@"title"].stringValue;
|
||||||
|
if (!desc || desc.length == 0)
|
||||||
|
desc = [child attributeForName:@"text"].stringValue;
|
||||||
|
// refreshInterval
|
||||||
|
NSXMLElement *li = make(@"li", desc, parent);
|
||||||
|
if (!thumb) {
|
||||||
|
NSString *xmlUrl = [child attributeForName:@"xmlUrl"].stringValue;
|
||||||
|
if (xmlUrl && xmlUrl.length > 0) {
|
||||||
|
[li addChild:[NSXMLNode textWithStringValue:@" — "]];
|
||||||
|
attribute(make(@"a", xmlUrl, li), @"href", xmlUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (child.childCount > 0) {
|
||||||
|
parent = make(@"ul", nil, parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (NSXMLElement *c in child.children) {
|
||||||
|
appendNode(c, parent, thumb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NSData* generateHTMLData(NSURL *url, NSBundle *bundle, BOOL thumb) {
|
||||||
|
NSError *err;
|
||||||
|
NSXMLDocument *doc = [[NSXMLDocument alloc] initWithContentsOfURL:url options:0 error:&err];
|
||||||
|
if (err || !doc) {
|
||||||
|
printf("ERROR: %s\n", err.description.UTF8String);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSXMLElement *html = [NSXMLElement elementWithName:@"html"];
|
||||||
|
NSXMLElement *head = make(@"head", nil, html);
|
||||||
|
make(@"title", @"OPML file", head);
|
||||||
|
|
||||||
|
NSString *cssPath = [bundle pathForResource:thumb ? @"style-thumb" : @"style" ofType:@"css"];
|
||||||
|
NSString *data = [NSString stringWithContentsOfFile:cssPath encoding:NSUTF8StringEncoding error:nil];
|
||||||
|
make(@"style", data, head);
|
||||||
|
|
||||||
|
NSXMLElement *body = make(@"body", nil, html);
|
||||||
|
|
||||||
|
for (NSXMLElement *child in doc.children) {
|
||||||
|
appendNode(child, body, thumb);
|
||||||
|
}
|
||||||
|
NSXMLDocument *xml = [NSXMLDocument documentWithRootElement:html];
|
||||||
|
return [xml XMLDataWithOptions:NSXMLNodePrettyPrint | NSXMLNodeCompactEmptyElement];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*void renderThumbnail(CFURLRef url, CFBundleRef bundle, CGContextRef context, CGSize maxSize) {
|
||||||
|
NSData *data = generateHTMLData((__bridge NSURL*)url, bundle, true);
|
||||||
|
if (data) {
|
||||||
|
CGRect rect = CGRectMake(0, 0, 600, 800);
|
||||||
|
float scale = maxSize.height / rect.size.height;
|
||||||
|
|
||||||
|
WebView *webView = [[WebView alloc] initWithFrame:rect];
|
||||||
|
[webView.mainFrame.frameView scaleUnitSquareToSize:CGSizeMake(scale, scale)];
|
||||||
|
[webView.mainFrame.frameView setAllowsScrolling:NO];
|
||||||
|
[webView.mainFrame loadData:data MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:nil];
|
||||||
|
|
||||||
|
while ([webView isLoading])
|
||||||
|
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true);
|
||||||
|
[webView display];
|
||||||
|
|
||||||
|
NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithGraphicsPort:(void *)context
|
||||||
|
flipped:webView.isFlipped];
|
||||||
|
[webView displayRectIgnoringOpacity:webView.bounds inContext:gc];
|
||||||
|
}
|
||||||
|
}*/
|
||||||
12
QLOPML/style.css
Normal file
12
QLOPML/style.css
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
* { font-family: Courier; }
|
||||||
|
body { padding: 30px; background-color: #AAA; color: black; }
|
||||||
|
dd, li, hr { font-weight: bold; line-height: 1.5em; }
|
||||||
|
ul { list-style-type: none; padding-bottom: 1em; }
|
||||||
|
a { font-size: 0.75em; color: #FBA43A; }
|
||||||
|
.section { padding: 1em 1.5em; border-radius: 7px; background-color: #EEE; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
body { background-color: #555; color: white; }
|
||||||
|
.section { background-color: #222; }
|
||||||
|
}
|
||||||
@@ -19,6 +19,8 @@
|
|||||||
54253C952C49BFE400742695 /* RegexConverterView.m in Sources */ = {isa = PBXBuildFile; fileRef = 54253C842C47369000742695 /* RegexConverterView.m */; };
|
54253C952C49BFE400742695 /* RegexConverterView.m in Sources */ = {isa = PBXBuildFile; fileRef = 54253C842C47369000742695 /* RegexConverterView.m */; };
|
||||||
544B011A2114B41200386E5C /* ModalSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = 544B01192114B41200386E5C /* ModalSheet.m */; };
|
544B011A2114B41200386E5C /* ModalSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = 544B01192114B41200386E5C /* ModalSheet.m */; };
|
||||||
544B011D2114EE9100386E5C /* AppHook.m in Sources */ = {isa = PBXBuildFile; fileRef = 544B011C2114EE9100386E5C /* AppHook.m */; };
|
544B011D2114EE9100386E5C /* AppHook.m in Sources */ = {isa = PBXBuildFile; fileRef = 544B011C2114EE9100386E5C /* AppHook.m */; };
|
||||||
|
544F5A752E30EFC700674F81 /* style.css in Resources */ = {isa = PBXBuildFile; fileRef = 544F5A722E30EFC700674F81 /* style.css */; };
|
||||||
|
544F5A762E30EFC700674F81 /* opml-lib.m in Sources */ = {isa = PBXBuildFile; fileRef = 544F5A702E30EFC700674F81 /* opml-lib.m */; };
|
||||||
54501010230E9C8600F0B165 /* FeedDownload.m in Sources */ = {isa = PBXBuildFile; fileRef = 5450100F230E9C8600F0B165 /* FeedDownload.m */; };
|
54501010230E9C8600F0B165 /* FeedDownload.m in Sources */ = {isa = PBXBuildFile; fileRef = 5450100F230E9C8600F0B165 /* FeedDownload.m */; };
|
||||||
546A6A2922C583390034E806 /* SettingsGeneralView.m in Sources */ = {isa = PBXBuildFile; fileRef = 54D857D122802309001BA1C8 /* SettingsGeneralView.m */; };
|
546A6A2922C583390034E806 /* SettingsGeneralView.m in Sources */ = {isa = PBXBuildFile; fileRef = 54D857D122802309001BA1C8 /* SettingsGeneralView.m */; };
|
||||||
546A6A2C22C584AF0034E806 /* SettingsAppearanceView.m in Sources */ = {isa = PBXBuildFile; fileRef = 546A6A2A22C584AF0034E806 /* SettingsAppearanceView.m */; };
|
546A6A2C22C584AF0034E806 /* SettingsAppearanceView.m in Sources */ = {isa = PBXBuildFile; fileRef = 546A6A2A22C584AF0034E806 /* SettingsAppearanceView.m */; };
|
||||||
@@ -40,6 +42,10 @@
|
|||||||
54ACC29821061FBA0020715F /* Preferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 54ACC29721061FBA0020715F /* Preferences.m */; };
|
54ACC29821061FBA0020715F /* Preferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 54ACC29721061FBA0020715F /* Preferences.m */; };
|
||||||
54AD4E0C2301853D000AE386 /* NSString+Ext.m in Sources */ = {isa = PBXBuildFile; fileRef = 54AD4E0B2301853D000AE386 /* NSString+Ext.m */; };
|
54AD4E0C2301853D000AE386 /* NSString+Ext.m in Sources */ = {isa = PBXBuildFile; fileRef = 54AD4E0B2301853D000AE386 /* NSString+Ext.m */; };
|
||||||
54AD4EE72305B17D000AE386 /* container-migration.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54AD4EE62305B17D000AE386 /* container-migration.plist */; };
|
54AD4EE72305B17D000AE386 /* container-migration.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54AD4EE62305B17D000AE386 /* container-migration.plist */; };
|
||||||
|
54AD90EA2E30C48400160925 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54AD90E92E30C48400160925 /* Quartz.framework */; };
|
||||||
|
54AD90EE2E30C48400160925 /* PreviewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 54AD90ED2E30C48400160925 /* PreviewViewController.m */; };
|
||||||
|
54AD90F12E30C48400160925 /* PreviewViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 54AD90EF2E30C48400160925 /* PreviewViewController.xib */; };
|
||||||
|
54AD90F72E30C48400160925 /* QLOPML.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 54AD90E72E30C48400160925 /* QLOPML.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||||
54B51704226DC339006C1B29 /* ModalFeedEditView.m in Sources */ = {isa = PBXBuildFile; fileRef = 54B51703226DC339006C1B29 /* ModalFeedEditView.m */; };
|
54B51704226DC339006C1B29 /* ModalFeedEditView.m in Sources */ = {isa = PBXBuildFile; fileRef = 54B51703226DC339006C1B29 /* ModalFeedEditView.m */; };
|
||||||
54B517072270E990006C1B29 /* NSView+Ext.m in Sources */ = {isa = PBXBuildFile; fileRef = 54B517062270E92A006C1B29 /* NSView+Ext.m */; };
|
54B517072270E990006C1B29 /* NSView+Ext.m in Sources */ = {isa = PBXBuildFile; fileRef = 54B517062270E92A006C1B29 /* NSView+Ext.m */; };
|
||||||
54B6F14A231551B3002C94C9 /* FaviconDownload.m in Sources */ = {isa = PBXBuildFile; fileRef = 54B6F149231551B3002C94C9 /* FaviconDownload.m */; };
|
54B6F14A231551B3002C94C9 /* FaviconDownload.m in Sources */ = {isa = PBXBuildFile; fileRef = 54B6F149231551B3002C94C9 /* FaviconDownload.m */; };
|
||||||
@@ -77,6 +83,13 @@
|
|||||||
remoteGlobalIDString = 84F22C171B52DDEA000060CE;
|
remoteGlobalIDString = 84F22C171B52DDEA000060CE;
|
||||||
remoteInfo = RSXML2Tests;
|
remoteInfo = RSXML2Tests;
|
||||||
};
|
};
|
||||||
|
54AD90F42E30C48400160925 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 54ACC27421061B3B0020715F /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 54AD90E62E30C48400160925;
|
||||||
|
remoteInfo = QLOPML;
|
||||||
|
};
|
||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
@@ -91,6 +104,17 @@
|
|||||||
name = "Embed Frameworks";
|
name = "Embed Frameworks";
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
54AD90F62E30C48400160925 /* Embed App Extensions */ = {
|
||||||
|
isa = PBXCopyFilesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
dstPath = "";
|
||||||
|
dstSubfolderSpec = 13;
|
||||||
|
files = (
|
||||||
|
54AD90F72E30C48400160925 /* QLOPML.appex in Embed App Extensions */,
|
||||||
|
);
|
||||||
|
name = "Embed App Extensions";
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
/* End PBXCopyFilesBuildPhase section */
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
@@ -120,6 +144,9 @@
|
|||||||
544B01192114B41200386E5C /* ModalSheet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ModalSheet.m; sourceTree = "<group>"; };
|
544B01192114B41200386E5C /* ModalSheet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ModalSheet.m; sourceTree = "<group>"; };
|
||||||
544B011B2114EE9100386E5C /* AppHook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppHook.h; sourceTree = "<group>"; };
|
544B011B2114EE9100386E5C /* AppHook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppHook.h; sourceTree = "<group>"; };
|
||||||
544B011C2114EE9100386E5C /* AppHook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppHook.m; sourceTree = "<group>"; };
|
544B011C2114EE9100386E5C /* AppHook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppHook.m; sourceTree = "<group>"; };
|
||||||
|
544F5A6F2E30EFC700674F81 /* opml-lib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "opml-lib.h"; sourceTree = "<group>"; };
|
||||||
|
544F5A702E30EFC700674F81 /* opml-lib.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "opml-lib.m"; sourceTree = "<group>"; };
|
||||||
|
544F5A722E30EFC700674F81 /* style.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = style.css; sourceTree = "<group>"; };
|
||||||
5450100E230E9C8600F0B165 /* FeedDownload.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FeedDownload.h; sourceTree = "<group>"; };
|
5450100E230E9C8600F0B165 /* FeedDownload.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FeedDownload.h; sourceTree = "<group>"; };
|
||||||
5450100F230E9C8600F0B165 /* FeedDownload.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FeedDownload.m; sourceTree = "<group>"; };
|
5450100F230E9C8600F0B165 /* FeedDownload.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FeedDownload.m; sourceTree = "<group>"; };
|
||||||
546A6A2A22C584AF0034E806 /* SettingsAppearanceView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsAppearanceView.m; sourceTree = "<group>"; };
|
546A6A2A22C584AF0034E806 /* SettingsAppearanceView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsAppearanceView.m; sourceTree = "<group>"; };
|
||||||
@@ -160,6 +187,13 @@
|
|||||||
54AD4E0B2301853D000AE386 /* NSString+Ext.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSString+Ext.m"; sourceTree = "<group>"; };
|
54AD4E0B2301853D000AE386 /* NSString+Ext.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSString+Ext.m"; sourceTree = "<group>"; };
|
||||||
54AD4EE42305AF60000AE386 /* baRSS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = baRSS.entitlements; sourceTree = "<group>"; };
|
54AD4EE42305AF60000AE386 /* baRSS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = baRSS.entitlements; sourceTree = "<group>"; };
|
||||||
54AD4EE62305B17D000AE386 /* container-migration.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "container-migration.plist"; sourceTree = "<group>"; };
|
54AD4EE62305B17D000AE386 /* container-migration.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "container-migration.plist"; sourceTree = "<group>"; };
|
||||||
|
54AD90E72E30C48400160925 /* QLOPML.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = QLOPML.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
54AD90E92E30C48400160925 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; };
|
||||||
|
54AD90EC2E30C48400160925 /* PreviewViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PreviewViewController.h; sourceTree = "<group>"; };
|
||||||
|
54AD90ED2E30C48400160925 /* PreviewViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PreviewViewController.m; sourceTree = "<group>"; };
|
||||||
|
54AD90F02E30C48400160925 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PreviewViewController.xib; sourceTree = "<group>"; };
|
||||||
|
54AD90F22E30C48400160925 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
54AD90F32E30C48400160925 /* QLOPML.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = QLOPML.entitlements; sourceTree = "<group>"; };
|
||||||
54B51702226DC339006C1B29 /* ModalFeedEditView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ModalFeedEditView.h; sourceTree = "<group>"; };
|
54B51702226DC339006C1B29 /* ModalFeedEditView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ModalFeedEditView.h; sourceTree = "<group>"; };
|
||||||
54B51703226DC339006C1B29 /* ModalFeedEditView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ModalFeedEditView.m; sourceTree = "<group>"; };
|
54B51703226DC339006C1B29 /* ModalFeedEditView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ModalFeedEditView.m; sourceTree = "<group>"; };
|
||||||
54B517052270E8C6006C1B29 /* NSView+Ext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSView+Ext.h"; sourceTree = "<group>"; };
|
54B517052270E8C6006C1B29 /* NSView+Ext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSView+Ext.h"; sourceTree = "<group>"; };
|
||||||
@@ -209,6 +243,14 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
54AD90E42E30C48400160925 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
54AD90EA2E30C48400160925 /* Quartz.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
@@ -315,6 +357,8 @@
|
|||||||
54892F1D2235285700271CBA /* CHANGELOG.md */,
|
54892F1D2235285700271CBA /* CHANGELOG.md */,
|
||||||
54ACC27E21061B3B0020715F /* baRSS */,
|
54ACC27E21061B3B0020715F /* baRSS */,
|
||||||
5483295E2A3CDB22000688B9 /* RSXML2.xcodeproj */,
|
5483295E2A3CDB22000688B9 /* RSXML2.xcodeproj */,
|
||||||
|
54AD90EB2E30C48400160925 /* QLOPML */,
|
||||||
|
54AD90E82E30C48400160925 /* Frameworks */,
|
||||||
54ACC27D21061B3B0020715F /* Products */,
|
54ACC27D21061B3B0020715F /* Products */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -323,6 +367,7 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
54ACC27C21061B3B0020715F /* baRSS Beta.app */,
|
54ACC27C21061B3B0020715F /* baRSS Beta.app */,
|
||||||
|
54AD90E72E30C48400160925 /* QLOPML.appex */,
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -367,6 +412,29 @@
|
|||||||
path = "Feed Import";
|
path = "Feed Import";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
54AD90E82E30C48400160925 /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
54AD90E92E30C48400160925 /* Quartz.framework */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
54AD90EB2E30C48400160925 /* QLOPML */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
544F5A6F2E30EFC700674F81 /* opml-lib.h */,
|
||||||
|
544F5A702E30EFC700674F81 /* opml-lib.m */,
|
||||||
|
54AD90EC2E30C48400160925 /* PreviewViewController.h */,
|
||||||
|
54AD90ED2E30C48400160925 /* PreviewViewController.m */,
|
||||||
|
54AD90EF2E30C48400160925 /* PreviewViewController.xib */,
|
||||||
|
54AD90F22E30C48400160925 /* Info.plist */,
|
||||||
|
54AD90F32E30C48400160925 /* QLOPML.entitlements */,
|
||||||
|
544F5A722E30EFC700674F81 /* style.css */,
|
||||||
|
);
|
||||||
|
path = QLOPML;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
54D857CF228022AB001BA1C8 /* General Tab */ = {
|
54D857CF228022AB001BA1C8 /* General Tab */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -455,16 +523,35 @@
|
|||||||
54ACC27A21061B3B0020715F /* Resources */,
|
54ACC27A21061B3B0020715F /* Resources */,
|
||||||
544DCCBB212A2B4D002DBC46 /* Embed Frameworks */,
|
544DCCBB212A2B4D002DBC46 /* Embed Frameworks */,
|
||||||
54FB05D12305BFAB00A088AD /* dynamic app name in db migration */,
|
54FB05D12305BFAB00A088AD /* dynamic app name in db migration */,
|
||||||
|
54AD90F62E30C48400160925 /* Embed App Extensions */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
|
54AD90F52E30C48400160925 /* PBXTargetDependency */,
|
||||||
);
|
);
|
||||||
name = baRSS;
|
name = baRSS;
|
||||||
productName = baRRS;
|
productName = baRRS;
|
||||||
productReference = 54ACC27C21061B3B0020715F /* baRSS Beta.app */;
|
productReference = 54ACC27C21061B3B0020715F /* baRSS Beta.app */;
|
||||||
productType = "com.apple.product-type.application";
|
productType = "com.apple.product-type.application";
|
||||||
};
|
};
|
||||||
|
54AD90E62E30C48400160925 /* QLOPML */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 54AD90F82E30C48400160925 /* Build configuration list for PBXNativeTarget "QLOPML" */;
|
||||||
|
buildPhases = (
|
||||||
|
54AD90E32E30C48400160925 /* Sources */,
|
||||||
|
54AD90E42E30C48400160925 /* Frameworks */,
|
||||||
|
54AD90E52E30C48400160925 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = QLOPML;
|
||||||
|
productName = QLOPML;
|
||||||
|
productReference = 54AD90E72E30C48400160925 /* QLOPML.appex */;
|
||||||
|
productType = "com.apple.product-type.app-extension";
|
||||||
|
};
|
||||||
/* End PBXNativeTarget section */
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
/* Begin PBXProject section */
|
||||||
@@ -490,6 +577,9 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
54AD90E62E30C48400160925 = {
|
||||||
|
CreatedOnToolsVersion = 12.4;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
buildConfigurationList = 54ACC27721061B3B0020715F /* Build configuration list for PBXProject "baRSS" */;
|
buildConfigurationList = 54ACC27721061B3B0020715F /* Build configuration list for PBXProject "baRSS" */;
|
||||||
@@ -512,6 +602,7 @@
|
|||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
targets = (
|
targets = (
|
||||||
54ACC27B21061B3B0020715F /* baRSS */,
|
54ACC27B21061B3B0020715F /* baRSS */,
|
||||||
|
54AD90E62E30C48400160925 /* QLOPML */,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
@@ -544,6 +635,15 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
54AD90E52E30C48400160925 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
54AD90F12E30C48400160925 /* PreviewViewController.xib in Resources */,
|
||||||
|
544F5A752E30EFC700674F81 /* style.css in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
/* End PBXResourcesBuildPhase section */
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
@@ -625,8 +725,36 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
54AD90E32E30C48400160925 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
544F5A762E30EFC700674F81 /* opml-lib.m in Sources */,
|
||||||
|
54AD90EE2E30C48400160925 /* PreviewViewController.m in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
/* End PBXSourcesBuildPhase section */
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXTargetDependency section */
|
||||||
|
54AD90F52E30C48400160925 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = 54AD90E62E30C48400160925 /* QLOPML */;
|
||||||
|
targetProxy = 54AD90F42E30C48400160925 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
/* End PBXTargetDependency section */
|
||||||
|
|
||||||
|
/* Begin PBXVariantGroup section */
|
||||||
|
54AD90EF2E30C48400160925 /* PreviewViewController.xib */ = {
|
||||||
|
isa = PBXVariantGroup;
|
||||||
|
children = (
|
||||||
|
54AD90F02E30C48400160925 /* Base */,
|
||||||
|
);
|
||||||
|
name = PreviewViewController.xib;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXVariantGroup section */
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
54ACC28E21061B3C0020715F /* Debug */ = {
|
54ACC28E21061B3C0020715F /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
@@ -791,7 +919,6 @@
|
|||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = de.relikd.baRSS.beta;
|
PRODUCT_BUNDLE_IDENTIFIER = de.relikd.baRSS.beta;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME) Beta";
|
PRODUCT_NAME = "$(TARGET_NAME) Beta";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
@@ -842,7 +969,47 @@
|
|||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = de.relikd.baRSS;
|
PRODUCT_BUNDLE_IDENTIFIER = de.relikd.baRSS;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
54AD90F92E30C48400160925 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_ENTITLEMENTS = QLOPML/QLOPML.entitlements;
|
||||||
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
INFOPLIST_FILE = QLOPML/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/../Frameworks",
|
||||||
|
"@executable_path/../../../../Frameworks",
|
||||||
|
);
|
||||||
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = de.relikd.baRSS.beta.QLOPML;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
54AD90FA2E30C48400160925 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_ENTITLEMENTS = QLOPML/QLOPML.entitlements;
|
||||||
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
|
INFOPLIST_FILE = QLOPML/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/../Frameworks",
|
||||||
|
"@executable_path/../../../../Frameworks",
|
||||||
|
);
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = de.relikd.baRSS.QLOPML;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
@@ -867,6 +1034,15 @@
|
|||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
|
54AD90F82E30C48400160925 /* Build configuration list for PBXNativeTarget "QLOPML" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
54AD90F92E30C48400160925 /* Debug */,
|
||||||
|
54AD90FA2E30C48400160925 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
|
|
||||||
/* Begin XCVersionGroup section */
|
/* Begin XCVersionGroup section */
|
||||||
|
|||||||
Reference in New Issue
Block a user