Repository: judi0713/TouTiao
Branch: master
Commit: 8c275d26ab51
Files: 40
Total size: 139.4 KB
Directory structure:
gitextract_n5eo_kqa/
├── .gitignore
├── LICENSE
├── Podfile
├── README.md
├── TouTiao/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── StatusBarButtonImage.imageset/
│ │ │ └── Contents.json
│ │ ├── TouTiao.imageset/
│ │ │ └── Contents.json
│ │ ├── comment-icon.imageset/
│ │ │ └── Contents.json
│ │ ├── icon-settings.imageset/
│ │ │ └── Contents.json
│ │ ├── icon-upvote.imageset/
│ │ │ └── Contents.json
│ │ └── icon.imageset/
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ └── MainMenu.xib
│ ├── Extension/
│ │ ├── NSDate+Extension.swift
│ │ └── String+Extension.swift
│ ├── Info.plist
│ ├── MainViewController.swift
│ ├── Model/
│ │ └── TTModel.swift
│ ├── Network/
│ │ └── NetWorkFetcher.swift
│ ├── PopViewController.swift
│ ├── Service/
│ │ └── EventMonitor.swift
│ ├── TouTiao.entitlements
│ └── View/
│ ├── PopViewController.swift
│ ├── PopViewController.xib
│ ├── SettingMenuAction.swift
│ ├── TTButton.swift
│ └── TTCell.swift
├── TouTiao.xcodeproj/
│ ├── project.pbxproj
│ └── project.xcworkspace/
│ └── contents.xcworkspacedata
├── TouTiao.xcworkspace/
│ └── contents.xcworkspacedata
├── TouTiaoLauncher/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ └── AppIcon.appiconset/
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ └── MainMenu.xib
│ ├── Info.plist
│ └── TouTiaoLauncher.entitlements
├── TouTiaoTests/
│ ├── Info.plist
│ └── TouTiaoTests.swift
└── TouTiaoUITests/
├── Info.plist
└── TouTiaoUITests.swift
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
.DS_Store
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
!default.xcworkspace
xcuserdata
*.moved-aside
*.mobileprovision
DerivedData
.idea/
Pods
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2013 Catch Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: Podfile
================================================
use_frameworks!
target 'TouTiao' do
pod 'Alamofire'
pod 'Fuzi'
end
================================================
FILE: README.md
================================================
# 开发者头条Mac端插件
下载移步 [release](https://github.com/judi0713/TouTiao/releases)
博客 [开发者头条插件小记](http://walkginkgo.com/ios/2016/05/04/Toutiao.html)
## 简介
最主要的是,这个是个人练手mac开发项目..

开发者头条是我日常用的比较多的看技术方面资料的网站。安利了好多人都在用。
> Alamofire不支持10.10的系统,所以低版本适配暂时做不了。有朋友在issue里说Alamofire可以,但是不知道是不是我哪做的不对没搞定..后面要考试了可能没有时间开发了..希望能有人提prprprprpr!!
## 现在这个版本V1.1
现在上了v1.1版本。修复了夜间模式,增加了开机启动。
感谢[droid-Q](https://github.com/droid-Q)提交的pr。我根据他的代码找到了更好的解决方法,增加了nstask。现在默认就是开机启动了。确实之前没有开机启动太蛋疼了..
希望更多人可以参与进来开发。
## 后面预期要做的
增加菊花。
增加网络层判断以及优化。
上拉刷新。
数据缓存。
重构代码。
增加开机启动。
## 最后
大三了时间也不是很多,后面尽量继续维护吧。
## License
MIT
================================================
FILE: TouTiao/AppDelegate.swift
================================================
//
// AppDelegate.swift
// TouTiao
//
// Created by tesths on 4/1/16.
// Copyright © 2016 tesths. All rights reserved.
//
import Cocoa
import ServiceManagement
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet weak var window: NSWindow!
let launcherAppIdentifier = "com.tesths.TouTiaoLauncher"
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application
startAtLogin()
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
func startAtLogin() {
//you should move this next line to somewhere else this is for testing purposes only!!!
SMLoginItemSetEnabled(launcherAppIdentifier as CFString, true)
var startedAtLogin = false
for app in NSWorkspace.shared().runningApplications {
if app.bundleIdentifier == launcherAppIdentifier {
startedAtLogin = true
}
}
if startedAtLogin {
DistributedNotificationCenter.default().post(name: .killme, object: Bundle.main.bundleIdentifier!)
print("i killed the launcher app!")
}
}
}
extension Notification.Name {
static let killme = Notification.Name("killme")
}
================================================
FILE: TouTiao/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "开发者头条圆角矩形-7.png",
"scale" : "1x"
},
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "开发者头条圆角矩形-6.png",
"scale" : "2x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "开发者头条圆角矩形-5.png",
"scale" : "1x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "开发者头条圆角矩形-4.png",
"scale" : "2x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "开发者头条圆角矩形-3.png",
"scale" : "1x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "开发者头条圆角矩形-2.png",
"scale" : "2x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "开发者头条圆角矩形-1.png",
"scale" : "1x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "开发者头条圆角矩形.png",
"scale" : "2x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "开发者头条圆角矩形-9.png",
"scale" : "1x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "开发者头条圆角矩形-8.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: TouTiao/Assets.xcassets/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: TouTiao/Assets.xcassets/StatusBarButtonImage.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "mac"
},
{
"idiom" : "mac",
"scale" : "1x"
},
{
"idiom" : "mac",
"filename" : "StatusBarButtonImage@2x.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: TouTiao/Assets.xcassets/TouTiao.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "mac",
"scale" : "1x"
},
{
"idiom" : "mac",
"filename" : "TouTiao@2x.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: TouTiao/Assets.xcassets/comment-icon.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "mac",
"scale" : "1x"
},
{
"idiom" : "mac",
"filename" : "icon-comment@2x.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: TouTiao/Assets.xcassets/icon-settings.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "mac",
"scale" : "1x"
},
{
"idiom" : "mac",
"filename" : "icon-settings.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: TouTiao/Assets.xcassets/icon-upvote.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "mac",
"scale" : "1x"
},
{
"idiom" : "mac",
"filename" : "vote.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: TouTiao/Assets.xcassets/icon.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "apple-icon-180x180.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: TouTiao/Base.lproj/MainMenu.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="10116" systemVersion="15E65" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="10116"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customObject id="Voe-Tx-rLC" customClass="MainViewController" customModule="TouTiao" customModuleProvider="target"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
</objects>
</document>
================================================
FILE: TouTiao/Extension/NSDate+Extension.swift
================================================
//
// NSDate+Extension.swift
// TouTiao
//
// Created by plusub on 4/26/16.
// Copyright © 2016 tesths. All rights reserved.
//
import Cocoa
extension Date
{
func hour() -> Int
{
//Get Hour
let calendar = Calendar.current
let components = (calendar as NSCalendar).components(.hour, from: self)
let hour = components.hour
//Return Hour
return hour!
}
func minute() -> Int
{
//Get Minute
let calendar = Calendar.current
let components = (calendar as NSCalendar).components(.minute, from: self)
let minute = components.minute
//Return Minute
return minute!
}
func toShortTimeString() -> String
{
//Get Short Time String
let formatter = DateFormatter()
formatter.timeStyle = .short
let timeString = formatter.string(from: self)
//Return Short Time String
return timeString
}
}
================================================
FILE: TouTiao/Extension/String+Extension.swift
================================================
//
// String+Extension.swift
// NotLonely-iOS
//
// Created by plusub on 3/16/16.
// Copyright © 2016 cm. All rights reserved.
//
import Foundation
extension String {
var length: Int {
return characters.count
}
}
================================================
FILE: TouTiao/Info.plist
================================================
<?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>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string></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>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.1</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.news</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>LSUIElement</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2016 tesths. All rights reserved.</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>
================================================
FILE: TouTiao/MainViewController.swift
================================================
//
// MainViewController.swift
// TouTiao
//
// Created by tesths on 4/1/16.
// Copyright © 2016 tesths. All rights reserved.
//
import Cocoa
class MainViewController: NSViewController {
let statusItem = NSStatusBar.system().statusItem(withLength: -2)
let popover = NSPopover()
var eventMonitor: EventMonitor?
override func awakeFromNib() {
if let button = statusItem.button {
button.image = NSImage(named: "TouTiao")
button.action = #selector(MainViewController.togglePopover(_:))
}
popover.behavior = .transient
popover.contentViewController = PopViewController(nibName: "PopViewController", bundle: nil)
popover.appearance = NSAppearance(named: NSAppearanceNameAqua)
popover.behavior = .transient
eventMonitor = EventMonitor(mask: [.leftMouseDown, .rightMouseDown]) { [unowned self] event in
if self.popover.isShown {
self.closePopover(event)
}
}
eventMonitor?.start()
addToLoginItems()
}
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
}
func addToLoginItems() {
// Process.launchedProcess(
// launchPath: "/usr/bin/osascript",
// arguments: [
// "-e",
// "tell application \"System Events\" to make login item at end with properties {path:\"/Applications/TouTiao.app\", hidden:false, name:\"Compute for TouTiao\"}"
// ]
// )
}
func togglePopover(_ sender: AnyObject?) {
if popover.isShown {
closePopover(sender)
} else {
showPopover(sender)
}
}
func showPopover(_ sender: AnyObject?) {
if let button = statusItem.button {
popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY)
}
NotificationCenter.default.post(name: Notification.Name(rawValue: "Reload"), object: nil)
eventMonitor?.start()
}
func closePopover(_ sender: AnyObject?) {
popover.performClose(sender)
eventMonitor?.stop()
}
func quit() {
NSApplication.shared().terminate(self)
}
}
================================================
FILE: TouTiao/Model/TTModel.swift
================================================
//
// TTModel.swift
// TouTiao
//
// Created by tesths on 4/11/16.
// Copyright © 2016 tesths. All rights reserved.
//
import Foundation
struct TTModel {
let title: String
let url: String
let href: String
let like: String
let comment: String
}
================================================
FILE: TouTiao/Network/NetWorkFetcher.swift
================================================
//
// NetWorkFetcher.swift
// TouTiao
//
// Created by tesths on 4/11/16.
// Copyright © 2016 tesths. All rights reserved.
//
import Cocoa
import Alamofire
import Fuzi
class NetWorkFetcher: NSObject {
let url = "https://toutiao.io/"
let Hoturl = "https://toutiao.io/posts/hot/7"
let Javaurl = "https://toutiao.io/c/java"
let iOSurl = "https://toutiao.io/c/ios"
let Weburl = "https://toutiao.io/c/fe"
func getReleases(url: String, _ done: @escaping (_ model: [TTModel]?) -> ()) {
Alamofire.request(url, method: .get )
.responseString { response in
guard let html = response.result.value else {
return done(nil)
}
let document = try? XMLDocument(string: html)
let body = document!.xpath("//div[@class='post']")
let releases = body.map { return self.release($0) }.flatMap { return $0 }
done(releases)
}
}
func release(_ element: Fuzi.XMLElement) -> [TTModel] {
var model = [TTModel]()
var url = String()
var href = String()
var title = String()
var like = String()
var comment = String()
let pth = element.xpath(".//div[@class='btn-group-vertical upvote']")
pth.forEach {tt in
for (index, element) in tt.xpath(".//span").enumerated() {
if index == 0 {
like = element.stringValue
break
}
}
}
let pth1 = element.xpath(".//div[@class='meta']/span")
pth1.forEach {tt in
let value = tt.stringValue
comment = value.trimmingCharacters(in: .whitespacesAndNewlines)
}
let pth2 = element.xpath(".//div[@class='meta']")
pth2.forEach {tt in
let value = tt.stringValue.components(separatedBy: "\n")
url = value[1].trimmingCharacters(in: .whitespacesAndNewlines)
}
let pth3 = element.xpath(".//h3[@class='title']/a")
pth3.forEach {tt in
pth3.forEach { pth in
href = pth["href"]!
title = pth.stringValue
}
}
model.append(
TTModel(
title: title,
url: url,
href: href,
like: like,
comment: comment
)
)
return model
}
}
================================================
FILE: TouTiao/PopViewController.swift
================================================
//
// PopViewController.swift
// TouTiao
//
// Created by tesths on 4/1/16.
// Copyright © 2016 tesths. All rights reserved.
//
import Cocoa
class PopViewController: NSViewController {
let fetcher = NetWorkFetcher()
@IBOutlet weak var headView: NSView! {
didSet {
headView.wantsLayer = true
headView.layer?.backgroundColor = NSColor(red:0.16, green:0.69, blue:0.93, alpha:1.00).CGColor
}
}
@IBOutlet weak var titleLabel: NSTextField! {
didSet {
titleLabel.font = NSFont.systemFontOfSize(14)
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
fetcher.getReleases{
result in
print(result)
}
fetcher.gettest {
result in
print(result)
}
}
}
// MARK: - NSTableViewDataSource
extension PopViewController: NSTableViewDataSource {
func numberOfRowsInTableView(aTableView: NSTableView) -> Int {
return 5
}
func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
let cellView = tableView.makeViewWithIdentifier(tableColumn!.identifier, owner: tableView) as! NSTableCellView
if tableColumn!.identifier == "TouTiaoCell" {
cellView.textField!.stringValue = "123"
return cellView
}
return cellView
}
}
extension PopViewController: NSTableViewDelegate {
}
================================================
FILE: TouTiao/Service/EventMonitor.swift
================================================
//
// EventMonitor.swift
// TouTiao
//
// Created by plusub on 4/22/16.
// Copyright © 2016 tesths. All rights reserved.
//
import Cocoa
open class EventMonitor {
fileprivate var monitor: AnyObject?
fileprivate let mask: NSEventMask
fileprivate let handler: (NSEvent?) -> ()
public init(mask: NSEventMask, handler: @escaping (NSEvent?) -> ()) {
self.mask = mask
self.handler = handler
}
deinit {
stop()
}
open func start() {
monitor = NSEvent.addGlobalMonitorForEvents(matching: mask, handler: handler) as AnyObject?
}
open func stop() {
if monitor != nil {
NSEvent.removeMonitor(monitor!)
monitor = nil
}
}
}
================================================
FILE: TouTiao/TouTiao.entitlements
================================================
<?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.network.client</key>
<true/>
</dict>
</plist>
================================================
FILE: TouTiao/View/PopViewController.swift
================================================
//
// PopViewController.swift
// TouTiao
//
// Created by tesths on 4/1/16.
// Copyright © 2016 tesths. All rights reserved.
//
import Cocoa
import Fuzi
//import Kanna
class PopViewController: NSViewController {
let fetcher = NetWorkFetcher()
var model = [TTModel]()
let webHome = "https://toutiao.io"
var postUrl : String = ""
@IBOutlet weak var tableView: NSTableView!
@IBOutlet weak var timeTextView: NSTextField!
@IBAction func toutiaoPost(_ sender: Any) {
postUrl = fetcher.url
reloadData()
}
@IBAction func hotPost(_ sender: Any) {
postUrl = fetcher.Hoturl
reloadData()
}
@IBAction func JavaPost(_ sender: Any) {
postUrl = fetcher.Javaurl
reloadData()
}
@IBAction func iOSPost(_ sender: Any) {
postUrl = fetcher.iOSurl
reloadData()
}
@IBAction func WebPost(_ sender: Any) {
postUrl = fetcher.Weburl
reloadData()
}
@IBOutlet weak var headerView: NSView! {
didSet {
headerView.wantsLayer = true
headerView.layer?.backgroundColor = NSColor.white.cgColor
}
}
@IBOutlet weak var footerView: NSView! {
didSet {
footerView.wantsLayer = true
footerView.layer?.backgroundColor = NSColor.init(red:0.16, green:0.69, blue:0.93, alpha:1.00).cgColor
}
}
@IBOutlet weak var titleLabel: NSTextField! {
didSet {
titleLabel.font = NSFont.systemFont(ofSize: 14)
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
NotificationCenter.default.addObserver(self, selector: #selector(PopViewController.reloadData), name:NSNotification.Name(rawValue: "Reload"), object: nil)
postUrl = fetcher.url
}
@IBAction func toggleSettingButton(_ sender: NSView) {
let menu = SettingMenuAction()
menu.perform(sender)
}
func reloadData() {
fetcher.getReleases(url: postUrl) {
result in
self.model = result!
self.tableView.reloadData()
self.setTime()
}
}
func setTime() {
let currentDate = Date()
timeTextView.stringValue = "更新时间 \(currentDate.toShortTimeString())"
}
}
// MARK: - NSTableViewDataSource
extension PopViewController: NSTableViewDataSource {
func numberOfRows(in aTableView: NSTableView) -> Int {
return model.count
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let cellView = tableView.make(withIdentifier: tableColumn!.identifier, owner: tableView) as! TTCell
cellView.configureData(self.model[row])
return cellView
}
}
extension PopViewController: NSTableViewDelegate {
func tableViewSelectionDidChange(_ notification: Notification) {
let table = notification.object as! NSTableView
print(URL(string: model[table.selectedRow].href)!)
NSWorkspace.shared().open(URL(string: webHome + model[table.selectedRow].href)!)
}
}
================================================
FILE: TouTiao/View/PopViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11762" systemVersion="16D32" 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"/>
<capability name="system font weights other than Regular or Bold" minToolsVersion="7.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="PopViewController" customModule="TouTiao" customModuleProvider="target">
<connections>
<outlet property="footerView" destination="ra6-WO-HWt" id="eNX-Td-YKz"/>
<outlet property="headerView" destination="fVh-zc-72y" id="qXG-Fg-Wrt"/>
<outlet property="tableView" destination="QHU-nt-C1m" id="HEY-eL-4qe"/>
<outlet property="timeTextView" destination="uFt-nT-nDr" id="ojM-wb-l6r"/>
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView id="Hz6-mo-xeY">
<rect key="frame" x="0.0" y="0.0" width="388" height="333"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<userGuides>
<userLayoutGuide location="362" affinity="minX"/>
</userGuides>
<subviews>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fVh-zc-72y">
<rect key="frame" x="0.0" y="291" width="388" height="42"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="uFt-nT-nDr">
<rect key="frame" x="6" y="13" width="182" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="更新时间" id="3dA-le-L8n">
<font key="font" size="13" name=".PingFangSC-Regular"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
</customView>
<scrollView fixedFrame="YES" autohidesScrollers="YES" horizontalLineScroll="70" horizontalPageScroll="10" verticalLineScroll="70" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" scrollerKnobStyle="light" translatesAutoresizingMaskIntoConstraints="NO" id="ppl-dX-oz4">
<rect key="frame" x="0.0" y="39" width="388" height="253"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" ambiguous="YES" drawsBackground="NO" id="Y9p-SQ-hIT">
<rect key="frame" x="1" y="1" width="386" height="251"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" selectionHighlightStyle="none" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" rowHeight="68" rowSizeStyle="automatic" viewBased="YES" id="QHU-nt-C1m">
<rect key="frame" x="0.0" y="0.0" width="386" height="251"/>
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<tableViewGridLines key="gridStyleMask" horizontal="YES"/>
<color key="gridColor" name="windowBackgroundColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn identifier="TTCell" width="383" minWidth="40" maxWidth="1000" id="Hm0-6m-I5b">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="XZd-KL-hAW">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView identifier="TTCell" id="6Bc-dn-LMV" customClass="TTCell" customModule="TouTiao" customModuleProvider="target">
<rect key="frame" x="1" y="1" width="383" height="68"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" preferredMaxLayoutWidth="369" translatesAutoresizingMaskIntoConstraints="NO" id="VYl-mj-lPy">
<rect key="frame" x="3" y="27" width="374" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" enabled="NO" refusesFirstResponder="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" alignment="left" title="Tagline" usesSingleLineMode="YES" id="KC4-ee-JfK">
<font key="font" metaFont="system"/>
<color key="textColor" name="headerColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" red="0.078431375319999996" green="0.91372555489999996" blue="0.2196078598" alpha="1" colorSpace="deviceRGB"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" preferredMaxLayoutWidth="369" translatesAutoresizingMaskIntoConstraints="NO" id="k7s-DT-8A0">
<rect key="frame" x="3" y="46" width="374" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" enabled="NO" refusesFirstResponder="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Title" usesSingleLineMode="YES" id="Kd9-aE-BZO">
<font key="font" metaFont="systemSemibold" size="13"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" red="0.76470588240000004" green="0.1647058824" blue="0.1058823529" alpha="1" colorSpace="calibratedRGB"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wTS-AE-tX9">
<rect key="frame" x="75" y="7" width="30" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="9999" id="UrE-Bq-4VL">
<font key="font" metaFont="system" size="10"/>
<color key="textColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6bw-fY-FNA" userLabel="Upvote Count Label">
<rect key="frame" x="18" y="7" width="30" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="9999" id="IKD-1Q-c22">
<font key="font" metaFont="system" size="10"/>
<color key="textColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="E1t-Ye-DJX" userLabel="Upvote Imagage View">
<rect key="frame" x="3" y="8" width="15" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="icon-upvote" id="ejA-cb-jpa"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="3wI-Ch-oQ4" userLabel="Comment Image View">
<rect key="frame" x="58" y="8" width="15" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="comment-icon" id="VoG-ib-3yQ"/>
</imageView>
</subviews>
<connections>
<outlet property="commentTextField" destination="wTS-AE-tX9" id="lsg-ZX-lQe"/>
<outlet property="titleTextView" destination="k7s-DT-8A0" id="Oj6-L6-Quk"/>
<outlet property="urlTextField" destination="VYl-mj-lPy" id="odm-YU-awN"/>
<outlet property="voteTextField" destination="6bw-fY-FNA" id="Kkm-jt-hg1"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="-2" id="Gf5-gb-jBw"/>
<outlet property="delegate" destination="-2" id="Z3z-Au-puJ"/>
</connections>
</tableView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="I7T-V4-zCI">
<rect key="frame" x="-100" y="-100" width="223" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="6lR-Zo-ea5">
<rect key="frame" x="-100" y="-100" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ra6-WO-HWt">
<rect key="frame" x="0.0" y="0.0" width="388" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wdH-4K-wwI">
<rect key="frame" x="353" y="11" width="17" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="icon-settings" imagePosition="only" alignment="center" state="on" imageScaling="proportionallyUpOrDown" inset="2" id="RcA-wf-TKD">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toggleSettingButton:" target="-2" id="DeF-0N-Rgf"/>
</connections>
</button>
<button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vF0-MR-36f">
<rect key="frame" x="12" y="7" width="26" height="26"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="icon" imagePosition="only" alignment="center" state="on" imageScaling="proportionallyUpOrDown" inset="2" id="Uje-y5-cIl">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toutiaoPost:" target="-2" id="MAV-F6-cBu"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="lUs-5b-05B" customClass="TTButton" customModule="TouTiao" customModuleProvider="target">
<rect key="frame" x="46" y="8" width="71" height="26"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="smallSquare" title="热门分享" bezelStyle="smallSquare" alignment="center" imageScaling="proportionallyDown" inset="2" id="TqP-ot-uxP">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="color" keyPath="textColor">
<color key="value" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="hotPost:" target="-2" id="DuE-ef-I7Z"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zci-gl-tyM" customClass="TTButton" customModule="TouTiao" customModuleProvider="target">
<rect key="frame" x="231" y="8" width="33" height="26"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="bevel" title="Java" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="bvb-vH-9XU">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" size="13" name=".PingFangSC-Regular"/>
</buttonCell>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="color" keyPath="textColor">
<color key="value" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="JavaPost:" target="-2" id="Zy9-Um-YPw"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4bS-iI-Hnh" customClass="TTButton" customModule="TouTiao" customModuleProvider="target">
<rect key="frame" x="272" y="8" width="33" height="26"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="bevel" title="iOS" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="msH-MR-ro5">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" size="13" name=".PingFangSC-Regular"/>
</buttonCell>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="color" keyPath="textColor">
<color key="value" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="iOSPost:" target="-2" id="2UM-RY-y3x"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="9RX-vw-4LR" customClass="TTButton" customModule="TouTiao" customModuleProvider="target">
<rect key="frame" x="313" y="8" width="33" height="26"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="bevel" title="前端" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="iFI-rY-Nv4">
<behavior key="behavior" lightByContents="YES"/>
<font key="font" size="13" name=".PingFangSC-Regular"/>
</buttonCell>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="color" keyPath="textColor">
<color key="value" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="WebPost:" target="-2" id="3qq-i1-sPV"/>
</connections>
</button>
</subviews>
</customView>
</subviews>
<point key="canvasLocation" x="-448" y="135"/>
</customView>
</objects>
<resources>
<image name="comment-icon" width="25" height="25"/>
<image name="icon" width="180" height="180"/>
<image name="icon-settings" width="50" height="50"/>
<image name="icon-upvote" width="25" height="25"/>
</resources>
</document>
================================================
FILE: TouTiao/View/SettingMenuAction.swift
================================================
//
// SettingMenuAction.swift
// TouTiao
//
// Created by plusub on 4/26/16.
// Copyright © 2016 tesths. All rights reserved.
//
import Cocoa
import ServiceManagement
class SettingMenuAction {
let launcherAppIdentifier = "com.tesths.TouTiaoLauncher"
var autoLaunch: Bool = true
let startMenu = NSMenuItem(title: "开机启动", action: #selector(startLogin), keyEquivalent: "")
func perform(_ sender: NSView) {
let delegate = NSApplication.shared().delegate as! MainViewController
let menu = NSMenu()
// let hotShare = NSMenuItem()
// hotShare.title = "热门分享"
// let share7 = NSMenu(title: "最近 7 天")
// let share30 = NSMenu(title: "最近 30 天")
// let share30 = NSMenu().addItem(withTitle: "最近 30 天", action: #selector(delegate.quit), keyEquivalent: "q")
// let hare90 = NSMenu().addItem(withTitle: "最近 90 天", action: #selector(delegate.quit), keyEquivalent: "q")
// hotShare.submenu = share7
// hotShare.submenu = share30
// menu.addItem(NSMenuItem(title: "开机启动", action: #selector(startLogin), keyEquivalent: ""))
menu.addItem(NSMenuItem(title: "退出", action: #selector(delegate.quit), keyEquivalent: "q"))
NSMenu.popUpContextMenu(menu, with: NSApp.currentEvent!, for: sender)
}
@objc func startLogin() {
autoLaunch = !autoLaunch
if autoLaunch == true {
startMenu.title = "开机启动"
} else {
startMenu.title = "开机不启动"
}
SMLoginItemSetEnabled(launcherAppIdentifier as CFString, autoLaunch)
}
}
================================================
FILE: TouTiao/View/TTButton.swift
================================================
//
// TTButton.swift
// TouTiao
//
// Created by tesths on 25/03/2017.
// Copyright © 2017 tesths. All rights reserved.
//
import Cocoa
@IBDesignable
class TTButton: NSButton
{
@IBInspectable var bgColor: NSColor?
@IBInspectable var textColor: NSColor?
override func awakeFromNib()
{
if let textColor = textColor, let font = font
{
let style = NSMutableParagraphStyle()
style.alignment = .center
let attributes =
[
NSForegroundColorAttributeName: textColor,
NSFontAttributeName: font,
NSParagraphStyleAttributeName: style
] as [String : Any]
let attributedTitle = NSAttributedString(string: title, attributes: attributes)
self.attributedTitle = attributedTitle
}
}
override func draw(_ dirtyRect: NSRect)
{
if let bgColor = bgColor
{
bgColor.setFill()
NSRectFill(dirtyRect)
}
super.draw(dirtyRect)
}
}
================================================
FILE: TouTiao/View/TTCell.swift
================================================
//
// TTCell.swift
// TouTiao
//
// Created by plusub on 4/24/16.
// Copyright © 2016 tesths. All rights reserved.
//
import Cocoa
class TTCell: NSTableCellView {
@IBOutlet weak var titleTextView: NSTextField!
@IBOutlet weak var urlTextField: NSTextField!
@IBOutlet weak var voteTextField: NSTextField!
@IBOutlet weak var commentTextField: NSTextField!
override func awakeFromNib() {
super.awakeFromNib()
wantsLayer = true
layer?.backgroundColor = NSColor.white.cgColor
}
func configureData(_ model: TTModel) {
self.titleTextView.stringValue = model.title
self.urlTextField.stringValue = model.url
self.voteTextField.stringValue = model.like
self.commentTextField.stringValue = model.comment
}
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
}
}
================================================
FILE: TouTiao.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
0632F8C91E866CDE002A7058 /* TTButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0632F8C81E866CDE002A7058 /* TTButton.swift */; };
0632F8D11E8681EE002A7058 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0632F8D01E8681EE002A7058 /* AppDelegate.swift */; };
0632F8D31E8681EE002A7058 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0632F8D21E8681EE002A7058 /* Assets.xcassets */; };
0632F8D61E8681EE002A7058 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0632F8D41E8681EE002A7058 /* MainMenu.xib */; };
0632F8DE1E8682F8002A7058 /* TouTiaoLauncher.app in Resources */ = {isa = PBXBuildFile; fileRef = 0632F8CE1E8681EE002A7058 /* TouTiaoLauncher.app */; };
0632F8E41E868363002A7058 /* TouTiaoLauncher.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0632F8CE1E8681EE002A7058 /* TouTiaoLauncher.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
06541A2B1CBB6074004312AC /* TTModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06541A2A1CBB6074004312AC /* TTModel.swift */; };
06541A2E1CBB61B2004312AC /* NetWorkFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06541A2D1CBB61B2004312AC /* NetWorkFetcher.swift */; };
0673B73B1CAE2D06001FBF40 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0673B73A1CAE2D06001FBF40 /* AppDelegate.swift */; };
0673B73D1CAE2D06001FBF40 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0673B73C1CAE2D06001FBF40 /* Assets.xcassets */; };
0673B7401CAE2D06001FBF40 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0673B73E1CAE2D06001FBF40 /* MainMenu.xib */; };
0673B74B1CAE2D06001FBF40 /* TouTiaoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0673B74A1CAE2D06001FBF40 /* TouTiaoTests.swift */; };
0673B7561CAE2D06001FBF40 /* TouTiaoUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0673B7551CAE2D06001FBF40 /* TouTiaoUITests.swift */; };
0673B7681CAE32E1001FBF40 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0673B7671CAE32E1001FBF40 /* MainViewController.swift */; };
06953AEE1CBCB3040001D698 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06953AED1CBCB3040001D698 /* String+Extension.swift */; };
74355EC41CCA43BA0029999B /* EventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74355EC31CCA43BA0029999B /* EventMonitor.swift */; };
7484FE131CCF692300560763 /* NSDate+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7484FE121CCF692300560763 /* NSDate+Extension.swift */; };
7484FE161CCF72B300560763 /* SettingMenuAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7484FE151CCF72B300560763 /* SettingMenuAction.swift */; };
74D0AD2B1CC7A47F00126706 /* PopViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D0AD291CC7A47F00126706 /* PopViewController.swift */; };
74D0AD2C1CC7A47F00126706 /* PopViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 74D0AD2A1CC7A47F00126706 /* PopViewController.xib */; };
74E7E49B1CCCB64B00DCAE46 /* TTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74E7E49A1CCCB64B00DCAE46 /* TTCell.swift */; };
FC007F7B55726384DC59FE30 /* Pods_TouTiao.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C000B9EB5493E17915C8E77D /* Pods_TouTiao.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
0632F8DF1E8682F8002A7058 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0673B72F1CAE2D06001FBF40 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 0632F8CD1E8681EE002A7058;
remoteInfo = TouTiaoLauncher;
};
0673B7471CAE2D06001FBF40 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0673B72F1CAE2D06001FBF40 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 0673B7361CAE2D06001FBF40;
remoteInfo = TouTiao;
};
0673B7521CAE2D06001FBF40 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0673B72F1CAE2D06001FBF40 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 0673B7361CAE2D06001FBF40;
remoteInfo = TouTiao;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
0632F8E31E86835A002A7058 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = Contents/Library/LoginItems;
dstSubfolderSpec = 1;
files = (
0632F8E41E868363002A7058 /* TouTiaoLauncher.app in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
060165521E82036D0041842D /* TouTiao.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TouTiao.entitlements; sourceTree = "<group>"; };
0632F8C81E866CDE002A7058 /* TTButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TTButton.swift; sourceTree = "<group>"; };
0632F8CE1E8681EE002A7058 /* TouTiaoLauncher.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TouTiaoLauncher.app; sourceTree = BUILT_PRODUCTS_DIR; };
0632F8D01E8681EE002A7058 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
0632F8D21E8681EE002A7058 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
0632F8D51E8681EE002A7058 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
0632F8D71E8681EE002A7058 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
0632F8DB1E86823C002A7058 /* TouTiaoLauncher.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TouTiaoLauncher.entitlements; sourceTree = "<group>"; };
06541A2A1CBB6074004312AC /* TTModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TTModel.swift; sourceTree = "<group>"; };
06541A2D1CBB61B2004312AC /* NetWorkFetcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetWorkFetcher.swift; sourceTree = "<group>"; };
0673B7371CAE2D06001FBF40 /* TouTiao.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TouTiao.app; sourceTree = BUILT_PRODUCTS_DIR; };
0673B73A1CAE2D06001FBF40 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
0673B73C1CAE2D06001FBF40 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
0673B73F1CAE2D06001FBF40 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
0673B7411CAE2D06001FBF40 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
0673B7461CAE2D06001FBF40 /* TouTiaoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TouTiaoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
0673B74A1CAE2D06001FBF40 /* TouTiaoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TouTiaoTests.swift; sourceTree = "<group>"; };
0673B74C1CAE2D06001FBF40 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
0673B7511CAE2D06001FBF40 /* TouTiaoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TouTiaoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
0673B7551CAE2D06001FBF40 /* TouTiaoUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TouTiaoUITests.swift; sourceTree = "<group>"; };
0673B7571CAE2D06001FBF40 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
0673B7671CAE32E1001FBF40 /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = "<group>"; };
06953AED1CBCB3040001D698 /* String+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = "<group>"; };
57BAB250D52BE0BE8AE45323 /* Pods-TouTiao.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TouTiao.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TouTiao/Pods-TouTiao.debug.xcconfig"; sourceTree = "<group>"; };
74355EC31CCA43BA0029999B /* EventMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventMonitor.swift; sourceTree = "<group>"; };
7484FE121CCF692300560763 /* NSDate+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSDate+Extension.swift"; sourceTree = "<group>"; };
7484FE151CCF72B300560763 /* SettingMenuAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingMenuAction.swift; sourceTree = "<group>"; };
74D0AD291CC7A47F00126706 /* PopViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PopViewController.swift; sourceTree = "<group>"; };
74D0AD2A1CC7A47F00126706 /* PopViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PopViewController.xib; sourceTree = "<group>"; };
74E7E49A1CCCB64B00DCAE46 /* TTCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TTCell.swift; sourceTree = "<group>"; };
975E04C1B55E348097BD00B9 /* Pods-TouTiao.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TouTiao.release.xcconfig"; path = "Pods/Target Support Files/Pods-TouTiao/Pods-TouTiao.release.xcconfig"; sourceTree = "<group>"; };
C000B9EB5493E17915C8E77D /* Pods_TouTiao.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TouTiao.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
0632F8CB1E8681EE002A7058 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
0673B7341CAE2D06001FBF40 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
FC007F7B55726384DC59FE30 /* Pods_TouTiao.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
0673B7431CAE2D06001FBF40 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
0673B74E1CAE2D06001FBF40 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
0632F8CF1E8681EE002A7058 /* TouTiaoLauncher */ = {
isa = PBXGroup;
children = (
0632F8DB1E86823C002A7058 /* TouTiaoLauncher.entitlements */,
0632F8D01E8681EE002A7058 /* AppDelegate.swift */,
0632F8D21E8681EE002A7058 /* Assets.xcassets */,
0632F8D41E8681EE002A7058 /* MainMenu.xib */,
0632F8D71E8681EE002A7058 /* Info.plist */,
);
path = TouTiaoLauncher;
sourceTree = "<group>";
};
06541A271CBB5EDE004312AC /* Extension */ = {
isa = PBXGroup;
children = (
06953AED1CBCB3040001D698 /* String+Extension.swift */,
7484FE121CCF692300560763 /* NSDate+Extension.swift */,
);
path = Extension;
sourceTree = "<group>";
};
06541A281CBB5EDE004312AC /* Model */ = {
isa = PBXGroup;
children = (
06541A2A1CBB6074004312AC /* TTModel.swift */,
);
path = Model;
sourceTree = "<group>";
};
06541A291CBB5EDE004312AC /* View */ = {
isa = PBXGroup;
children = (
74D0AD291CC7A47F00126706 /* PopViewController.swift */,
74D0AD2A1CC7A47F00126706 /* PopViewController.xib */,
74E7E49A1CCCB64B00DCAE46 /* TTCell.swift */,
7484FE151CCF72B300560763 /* SettingMenuAction.swift */,
0632F8C81E866CDE002A7058 /* TTButton.swift */,
);
path = View;
sourceTree = "<group>";
};
06541A2C1CBB619B004312AC /* Network */ = {
isa = PBXGroup;
children = (
06541A2D1CBB61B2004312AC /* NetWorkFetcher.swift */,
);
path = Network;
sourceTree = "<group>";
};
0673B72E1CAE2D06001FBF40 = {
isa = PBXGroup;
children = (
0673B7391CAE2D06001FBF40 /* TouTiao */,
0673B7491CAE2D06001FBF40 /* TouTiaoTests */,
0673B7541CAE2D06001FBF40 /* TouTiaoUITests */,
0632F8CF1E8681EE002A7058 /* TouTiaoLauncher */,
0673B7381CAE2D06001FBF40 /* Products */,
6452FF8988F66956159D5EB8 /* Pods */,
5616DC1A69F16F3000F21CFD /* Frameworks */,
);
sourceTree = "<group>";
};
0673B7381CAE2D06001FBF40 /* Products */ = {
isa = PBXGroup;
children = (
0673B7371CAE2D06001FBF40 /* TouTiao.app */,
0673B7461CAE2D06001FBF40 /* TouTiaoTests.xctest */,
0673B7511CAE2D06001FBF40 /* TouTiaoUITests.xctest */,
0632F8CE1E8681EE002A7058 /* TouTiaoLauncher.app */,
);
name = Products;
sourceTree = "<group>";
};
0673B7391CAE2D06001FBF40 /* TouTiao */ = {
isa = PBXGroup;
children = (
060165521E82036D0041842D /* TouTiao.entitlements */,
74355EC21CCA439B0029999B /* Service */,
06541A2C1CBB619B004312AC /* Network */,
06541A271CBB5EDE004312AC /* Extension */,
06541A281CBB5EDE004312AC /* Model */,
06541A291CBB5EDE004312AC /* View */,
0673B73A1CAE2D06001FBF40 /* AppDelegate.swift */,
0673B7671CAE32E1001FBF40 /* MainViewController.swift */,
0673B73C1CAE2D06001FBF40 /* Assets.xcassets */,
0673B73E1CAE2D06001FBF40 /* MainMenu.xib */,
0673B7411CAE2D06001FBF40 /* Info.plist */,
);
path = TouTiao;
sourceTree = "<group>";
};
0673B7491CAE2D06001FBF40 /* TouTiaoTests */ = {
isa = PBXGroup;
children = (
0673B74A1CAE2D06001FBF40 /* TouTiaoTests.swift */,
0673B74C1CAE2D06001FBF40 /* Info.plist */,
);
path = TouTiaoTests;
sourceTree = "<group>";
};
0673B7541CAE2D06001FBF40 /* TouTiaoUITests */ = {
isa = PBXGroup;
children = (
0673B7551CAE2D06001FBF40 /* TouTiaoUITests.swift */,
0673B7571CAE2D06001FBF40 /* Info.plist */,
);
path = TouTiaoUITests;
sourceTree = "<group>";
};
5616DC1A69F16F3000F21CFD /* Frameworks */ = {
isa = PBXGroup;
children = (
C000B9EB5493E17915C8E77D /* Pods_TouTiao.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
6452FF8988F66956159D5EB8 /* Pods */ = {
isa = PBXGroup;
children = (
57BAB250D52BE0BE8AE45323 /* Pods-TouTiao.debug.xcconfig */,
975E04C1B55E348097BD00B9 /* Pods-TouTiao.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
74355EC21CCA439B0029999B /* Service */ = {
isa = PBXGroup;
children = (
74355EC31CCA43BA0029999B /* EventMonitor.swift */,
);
path = Service;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
0632F8CD1E8681EE002A7058 /* TouTiaoLauncher */ = {
isa = PBXNativeTarget;
buildConfigurationList = 0632F8D81E8681EE002A7058 /* Build configuration list for PBXNativeTarget "TouTiaoLauncher" */;
buildPhases = (
0632F8CA1E8681EE002A7058 /* Sources */,
0632F8CB1E8681EE002A7058 /* Frameworks */,
0632F8CC1E8681EE002A7058 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = TouTiaoLauncher;
productName = TouTiaoLauncher;
productReference = 0632F8CE1E8681EE002A7058 /* TouTiaoLauncher.app */;
productType = "com.apple.product-type.application";
};
0673B7361CAE2D06001FBF40 /* TouTiao */ = {
isa = PBXNativeTarget;
buildConfigurationList = 0673B75A1CAE2D06001FBF40 /* Build configuration list for PBXNativeTarget "TouTiao" */;
buildPhases = (
52B0ED3AB7C7A3109812DE9C /* [CP] Check Pods Manifest.lock */,
0673B7331CAE2D06001FBF40 /* Sources */,
0673B7341CAE2D06001FBF40 /* Frameworks */,
0673B7351CAE2D06001FBF40 /* Resources */,
B91C8649C7C920E3ADBF3C3D /* [CP] Embed Pods Frameworks */,
92770A1D9D011A674360C60F /* [CP] Copy Pods Resources */,
0632F8E31E86835A002A7058 /* CopyFiles */,
);
buildRules = (
);
dependencies = (
0632F8E01E8682F8002A7058 /* PBXTargetDependency */,
);
name = TouTiao;
productName = TouTiao;
productReference = 0673B7371CAE2D06001FBF40 /* TouTiao.app */;
productType = "com.apple.product-type.application";
};
0673B7451CAE2D06001FBF40 /* TouTiaoTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 0673B75D1CAE2D06001FBF40 /* Build configuration list for PBXNativeTarget "TouTiaoTests" */;
buildPhases = (
0673B7421CAE2D06001FBF40 /* Sources */,
0673B7431CAE2D06001FBF40 /* Frameworks */,
0673B7441CAE2D06001FBF40 /* Resources */,
);
buildRules = (
);
dependencies = (
0673B7481CAE2D06001FBF40 /* PBXTargetDependency */,
);
name = TouTiaoTests;
productName = TouTiaoTests;
productReference = 0673B7461CAE2D06001FBF40 /* TouTiaoTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
0673B7501CAE2D06001FBF40 /* TouTiaoUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 0673B7601CAE2D06001FBF40 /* Build configuration list for PBXNativeTarget "TouTiaoUITests" */;
buildPhases = (
0673B74D1CAE2D06001FBF40 /* Sources */,
0673B74E1CAE2D06001FBF40 /* Frameworks */,
0673B74F1CAE2D06001FBF40 /* Resources */,
);
buildRules = (
);
dependencies = (
0673B7531CAE2D06001FBF40 /* PBXTargetDependency */,
);
name = TouTiaoUITests;
productName = TouTiaoUITests;
productReference = 0673B7511CAE2D06001FBF40 /* TouTiaoUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
0673B72F1CAE2D06001FBF40 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0820;
LastUpgradeCheck = 0820;
ORGANIZATIONNAME = tesths;
TargetAttributes = {
0632F8CD1E8681EE002A7058 = {
CreatedOnToolsVersion = 8.2.1;
DevelopmentTeam = UTN47S84JC;
ProvisioningStyle = Automatic;
SystemCapabilities = {
com.apple.Sandbox = {
enabled = 1;
};
};
};
0673B7361CAE2D06001FBF40 = {
CreatedOnToolsVersion = 7.3;
DevelopmentTeam = UTN47S84JC;
LastSwiftMigration = 0800;
ProvisioningStyle = Automatic;
SystemCapabilities = {
com.apple.Sandbox = {
enabled = 1;
};
};
};
0673B7451CAE2D06001FBF40 = {
CreatedOnToolsVersion = 7.3;
LastSwiftMigration = 0800;
TestTargetID = 0673B7361CAE2D06001FBF40;
};
0673B7501CAE2D06001FBF40 = {
CreatedOnToolsVersion = 7.3;
LastSwiftMigration = 0800;
TestTargetID = 0673B7361CAE2D06001FBF40;
};
};
};
buildConfigurationList = 0673B7321CAE2D06001FBF40 /* Build configuration list for PBXProject "TouTiao" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 0673B72E1CAE2D06001FBF40;
productRefGroup = 0673B7381CAE2D06001FBF40 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
0673B7361CAE2D06001FBF40 /* TouTiao */,
0673B7451CAE2D06001FBF40 /* TouTiaoTests */,
0673B7501CAE2D06001FBF40 /* TouTiaoUITests */,
0632F8CD1E8681EE002A7058 /* TouTiaoLauncher */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
0632F8CC1E8681EE002A7058 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
0632F8D31E8681EE002A7058 /* Assets.xcassets in Resources */,
0632F8D61E8681EE002A7058 /* MainMenu.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
0673B7351CAE2D06001FBF40 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74D0AD2C1CC7A47F00126706 /* PopViewController.xib in Resources */,
0632F8DE1E8682F8002A7058 /* TouTiaoLauncher.app in Resources */,
0673B73D1CAE2D06001FBF40 /* Assets.xcassets in Resources */,
0673B7401CAE2D06001FBF40 /* MainMenu.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
0673B7441CAE2D06001FBF40 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
0673B74F1CAE2D06001FBF40 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
52B0ED3AB7C7A3109812DE9C /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n";
showEnvVarsInLog = 0;
};
92770A1D9D011A674360C60F /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TouTiao/Pods-TouTiao-resources.sh\"\n";
showEnvVarsInLog = 0;
};
B91C8649C7C920E3ADBF3C3D /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-TouTiao/Pods-TouTiao-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
0632F8CA1E8681EE002A7058 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
0632F8D11E8681EE002A7058 /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
0673B7331CAE2D06001FBF40 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
06541A2E1CBB61B2004312AC /* NetWorkFetcher.swift in Sources */,
0673B7681CAE32E1001FBF40 /* MainViewController.swift in Sources */,
74D0AD2B1CC7A47F00126706 /* PopViewController.swift in Sources */,
7484FE161CCF72B300560763 /* SettingMenuAction.swift in Sources */,
7484FE131CCF692300560763 /* NSDate+Extension.swift in Sources */,
06541A2B1CBB6074004312AC /* TTModel.swift in Sources */,
74355EC41CCA43BA0029999B /* EventMonitor.swift in Sources */,
0632F8C91E866CDE002A7058 /* TTButton.swift in Sources */,
0673B73B1CAE2D06001FBF40 /* AppDelegate.swift in Sources */,
06953AEE1CBCB3040001D698 /* String+Extension.swift in Sources */,
74E7E49B1CCCB64B00DCAE46 /* TTCell.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
0673B7421CAE2D06001FBF40 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
0673B74B1CAE2D06001FBF40 /* TouTiaoTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
0673B74D1CAE2D06001FBF40 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
0673B7561CAE2D06001FBF40 /* TouTiaoUITests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
0632F8E01E8682F8002A7058 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 0632F8CD1E8681EE002A7058 /* TouTiaoLauncher */;
targetProxy = 0632F8DF1E8682F8002A7058 /* PBXContainerItemProxy */;
};
0673B7481CAE2D06001FBF40 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 0673B7361CAE2D06001FBF40 /* TouTiao */;
targetProxy = 0673B7471CAE2D06001FBF40 /* PBXContainerItemProxy */;
};
0673B7531CAE2D06001FBF40 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 0673B7361CAE2D06001FBF40 /* TouTiao */;
targetProxy = 0673B7521CAE2D06001FBF40 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
0632F8D41E8681EE002A7058 /* MainMenu.xib */ = {
isa = PBXVariantGroup;
children = (
0632F8D51E8681EE002A7058 /* Base */,
);
name = MainMenu.xib;
sourceTree = "<group>";
};
0673B73E1CAE2D06001FBF40 /* MainMenu.xib */ = {
isa = PBXVariantGroup;
children = (
0673B73F1CAE2D06001FBF40 /* Base */,
);
name = MainMenu.xib;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
0632F8D91E8681EE002A7058 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CODE_SIGN_ENTITLEMENTS = TouTiaoLauncher/TouTiaoLauncher.entitlements;
CODE_SIGN_IDENTITY = "Mac Developer";
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = UTN47S84JC;
INFOPLIST_FILE = TouTiaoLauncher/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.12;
PRODUCT_BUNDLE_IDENTIFIER = com.tesths.TouTiaoLauncher;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_VERSION = 3.0;
};
name = Debug;
};
0632F8DA1E8681EE002A7058 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CODE_SIGN_ENTITLEMENTS = TouTiaoLauncher/TouTiaoLauncher.entitlements;
CODE_SIGN_IDENTITY = "Mac Developer";
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = UTN47S84JC;
INFOPLIST_FILE = TouTiaoLauncher/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.12;
PRODUCT_BUNDLE_IDENTIFIER = com.tesths.TouTiaoLauncher;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 3.0;
};
name = Release;
};
0673B7581CAE2D06001FBF40 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
0673B7591CAE2D06001FBF40 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
};
name = Release;
};
0673B75B1CAE2D06001FBF40 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 57BAB250D52BE0BE8AE45323 /* Pods-TouTiao.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = TouTiao/TouTiao.entitlements;
CODE_SIGN_IDENTITY = "Mac Developer";
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = UTN47S84JC;
INFOPLIST_FILE = TouTiao/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.11;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.TouTiao;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
0673B75C1CAE2D06001FBF40 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 975E04C1B55E348097BD00B9 /* Pods-TouTiao.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = TouTiao/TouTiao.entitlements;
CODE_SIGN_IDENTITY = "Mac Developer";
COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = UTN47S84JC;
INFOPLIST_FILE = TouTiao/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.11;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.TouTiao;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
};
name = Release;
};
0673B75E1CAE2D06001FBF40 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = TouTiaoTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = tesths.TouTiaoTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TouTiao.app/Contents/MacOS/TouTiao";
};
name = Debug;
};
0673B75F1CAE2D06001FBF40 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = TouTiaoTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = tesths.TouTiaoTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TouTiao.app/Contents/MacOS/TouTiao";
};
name = Release;
};
0673B7611CAE2D06001FBF40 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = TouTiaoUITests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = tesths.TouTiaoUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_TARGET_NAME = TouTiao;
};
name = Debug;
};
0673B7621CAE2D06001FBF40 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = TouTiaoUITests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = tesths.TouTiaoUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
TEST_TARGET_NAME = TouTiao;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
0632F8D81E8681EE002A7058 /* Build configuration list for PBXNativeTarget "TouTiaoLauncher" */ = {
isa = XCConfigurationList;
buildConfigurations = (
0632F8D91E8681EE002A7058 /* Debug */,
0632F8DA1E8681EE002A7058 /* Release */,
);
defaultConfigurationIsVisible = 0;
};
0673B7321CAE2D06001FBF40 /* Build configuration list for PBXProject "TouTiao" */ = {
isa = XCConfigurationList;
buildConfigurations = (
0673B7581CAE2D06001FBF40 /* Debug */,
0673B7591CAE2D06001FBF40 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
0673B75A1CAE2D06001FBF40 /* Build configuration list for PBXNativeTarget "TouTiao" */ = {
isa = XCConfigurationList;
buildConfigurations = (
0673B75B1CAE2D06001FBF40 /* Debug */,
0673B75C1CAE2D06001FBF40 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
0673B75D1CAE2D06001FBF40 /* Build configuration list for PBXNativeTarget "TouTiaoTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
0673B75E1CAE2D06001FBF40 /* Debug */,
0673B75F1CAE2D06001FBF40 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
0673B7601CAE2D06001FBF40 /* Build configuration list for PBXNativeTarget "TouTiaoUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
0673B7611CAE2D06001FBF40 /* Debug */,
0673B7621CAE2D06001FBF40 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 0673B72F1CAE2D06001FBF40 /* Project object */;
}
================================================
FILE: TouTiao.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:TouTiao.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: TouTiao.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:TouTiao.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: TouTiaoLauncher/AppDelegate.swift
================================================
//
// AppDelegate.swift
// TouTiaoLauncher
//
// Created by tesths on 25/03/2017.
// Copyright © 2017 tesths. All rights reserved.
//
import Cocoa
extension Notification.Name {
static let killme = Notification.Name("killme")
}
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate
{
let mainAppIdentifier = "com.tt.TouTiao"
func applicationDidFinishLaunching(_ aNotification: Notification) {
let running = NSWorkspace.shared().runningApplications
var alreadyRunning = false
for app in running {
if app.bundleIdentifier == mainAppIdentifier {
alreadyRunning = true
break
}
}
if !alreadyRunning {
DistributedNotificationCenter.default().addObserver(self, selector: #selector(self.terminate), name: .killme, object: mainAppIdentifier)
let path = Bundle.main.bundlePath as NSString
var components = path.pathComponents
components.removeLast()
components.removeLast()
components.removeLast()
components.append("MacOS")
components.append("TouTiao") //main app name
let newPath = NSString.path(withComponents: components)
NSWorkspace.shared().launchApplication(newPath)
}
else {
self.terminate()
}
}
func terminate() {
// NSLog("I'll be back!")
NSApp.terminate(nil)
}
}
================================================
FILE: TouTiaoLauncher/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"idiom" : "mac",
"size" : "16x16",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "16x16",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "32x32",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "32x32",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "128x128",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "128x128",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "256x256",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "256x256",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "512x512",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "512x512",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: TouTiaoLauncher/Base.lproj/MainMenu.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11134" systemVersion="15F34" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11134"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModuleProvider="target">
<connections>
<outlet property="window" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/>
</connections>
</customObject>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="TouTiaoLauncher" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="TouTiaoLauncher" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About TouTiaoLauncher" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide TouTiaoLauncher" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit TouTiaoLauncher" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="dMs-cI-mzQ">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="bib-Uj-vzu">
<items>
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
<connections>
<action selector="newDocument:" target="-1" id="4Si-XN-c54"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
<connections>
<action selector="openDocument:" target="-1" id="bVn-NM-KNZ"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="tXI-mr-wws">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
<items>
<menuItem title="Clear Menu" id="vNY-rz-j42">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="clearRecentDocuments:" target="-1" id="Daa-9d-B3U"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
<connections>
<action selector="performClose:" target="-1" id="HmO-Ls-i7Q"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
<connections>
<action selector="saveDocument:" target="-1" id="teZ-XB-qJY"/>
</connections>
</menuItem>
<menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
<connections>
<action selector="saveDocumentAs:" target="-1" id="mDf-zr-I0C"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" keyEquivalent="r" id="KaW-ft-85H">
<connections>
<action selector="revertDocumentToSaved:" target="-1" id="iJ3-Pv-kwq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="-1" id="Din-rz-gC5"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
<connections>
<action selector="print:" target="-1" id="qaZ-4w-aoO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="5QF-Oa-p0T">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
<items>
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
<connections>
<action selector="undo:" target="-1" id="M6e-cu-g7V"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
<connections>
<action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
<connections>
<action selector="cut:" target="-1" id="YJe-68-I9s"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
<connections>
<action selector="copy:" target="-1" id="G1f-GL-Joy"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
<connections>
<action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
</connections>
</menuItem>
<menuItem title="Delete" id="pa3-QI-u2k">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
<connections>
<action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
<menuItem title="Find" id="4EN-yA-p0u">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Find" id="1b7-l0-nxx">
<items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
<connections>
<action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
<connections>
<action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
</connections>
</menuItem>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
<connections>
<action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
<connections>
<action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
<items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
<connections>
<action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
<connections>
<action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Substitutions" id="9ic-FL-obx">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
<items>
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
</connections>
</menuItem>
<menuItem title="Smart Links" id="cwL-P1-jid">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
</connections>
</menuItem>
<menuItem title="Data Detectors" id="tRr-pd-1PS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
</connections>
</menuItem>
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Transformations" id="2oI-Rn-ZJC">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
<items>
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
</connections>
</menuItem>
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
</connections>
</menuItem>
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Speech" id="xrE-MZ-jX0">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
<items>
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Format" id="jxT-CU-nIS">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Format" id="GEO-Iw-cKr">
<items>
<menuItem title="Font" id="Gi5-1S-RQB">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
<items>
<menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq">
<connections>
<action selector="orderFrontFontPanel:" target="YLy-65-1bz" id="WHr-nq-2xA"/>
</connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="hqk-hr-sYV"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="IHV-OB-c03"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
<connections>
<action selector="underline:" target="-1" id="FYS-2b-JAY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="Uc7-di-UnL"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="HcX-Lf-eNd"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
<menuItem title="Kern" id="jBQ-r6-VK2">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Kern" id="tlD-Oa-oAM">
<items>
<menuItem title="Use Default" id="GUa-eO-cwY">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="-1" id="6dk-9l-Ckg"/>
</connections>
</menuItem>
<menuItem title="Use None" id="cDB-IK-hbR">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="-1" id="U8a-gz-Maa"/>
</connections>
</menuItem>
<menuItem title="Tighten" id="46P-cB-AYj">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="-1" id="hr7-Nz-8ro"/>
</connections>
</menuItem>
<menuItem title="Loosen" id="ogc-rX-tC1">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="-1" id="8i4-f9-FKE"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Ligatures" id="o6e-r0-MWq">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
<items>
<menuItem title="Use Default" id="agt-UL-0e3">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="-1" id="7uR-wd-Dx6"/>
</connections>
</menuItem>
<menuItem title="Use None" id="J7y-lM-qPV">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="-1" id="iX2-gA-Ilz"/>
</connections>
</menuItem>
<menuItem title="Use All" id="xQD-1f-W4t">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="-1" id="KcB-kA-TuK"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Baseline" id="OaQ-X3-Vso">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Baseline" id="ijk-EB-dga">
<items>
<menuItem title="Use Default" id="3Om-Ey-2VK">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="-1" id="0vZ-95-Ywn"/>
</connections>
</menuItem>
<menuItem title="Superscript" id="Rqc-34-cIF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="-1" id="3qV-fo-wpU"/>
</connections>
</menuItem>
<menuItem title="Subscript" id="I0S-gh-46l">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="-1" id="Q6W-4W-IGz"/>
</connections>
</menuItem>
<menuItem title="Raise" id="2h7-ER-AoG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="-1" id="4sk-31-7Q9"/>
</connections>
</menuItem>
<menuItem title="Lower" id="1tx-W0-xDw">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="-1" id="OF1-bc-KW4"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
<menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
<connections>
<action selector="orderFrontColorPanel:" target="-1" id="mSX-Xz-DV3"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
<menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="-1" id="GJO-xA-L4q"/>
</connections>
</menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="-1" id="JfD-CL-leO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Text" id="Fal-I4-PZk">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="d9c-me-L2H">
<items>
<menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
<connections>
<action selector="alignLeft:" target="-1" id="zUv-R1-uAa"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
<connections>
<action selector="alignCenter:" target="-1" id="spX-mk-kcS"/>
</connections>
</menuItem>
<menuItem title="Justify" id="J5U-5w-g23">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="-1" id="ljL-7U-jND"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
<connections>
<action selector="alignRight:" target="-1" id="r48-bG-YeY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
<menuItem title="Writing Direction" id="H1b-Si-o9J">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
<items>
<menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="YGs-j5-SAR">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="-1" id="qtV-5e-UBP"/>
</connections>
</menuItem>
<menuItem id="Lbh-J2-qVU">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="S0X-9S-QSf"/>
</connections>
</menuItem>
<menuItem id="jFq-tB-4Kx">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="5fk-qB-AqJ"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
<menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="Nop-cj-93Q">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="-1" id="lPI-Se-ZHp"/>
</connections>
</menuItem>
<menuItem id="BgM-ve-c93">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="caW-Bv-w94"/>
</connections>
</menuItem>
<menuItem id="RB4-Sm-HuC">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="EXD-6r-ZUu"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
<menuItem title="Show Ruler" id="vLm-3I-IUL">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="-1" id="FOx-HJ-KwY"/>
</connections>
</menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="-1" id="71i-fW-3W2"/>
</connections>
</menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="-1" id="cSh-wd-qM2"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="View" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="View" id="HyV-fh-RgO">
<items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="-1" id="BXY-wc-z0C"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="runToolbarCustomizationPalette:" target="-1" id="pQI-g3-MTW"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="hB3-LF-h0Y"/>
<menuItem title="Show Sidebar" keyEquivalent="s" id="kIP-vf-haE">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleSourceList:" target="-1" id="iwa-gc-5KM"/>
</connections>
</menuItem>
<menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleFullScreen:" target="-1" id="dU3-MA-1Rq"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="TouTiaoLauncher Help" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<window title="TouTiaoLauncher" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="335" y="390" width="480" height="360"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
<view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
<rect key="frame" x="0.0" y="0.0" width="480" height="360"/>
<autoresizingMask key="autoresizingMask"/>
</view>
</window>
</objects>
</document>
================================================
FILE: TouTiaoLauncher/Info.plist
================================================
<?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>LSBackgroundOnly</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string></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>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2017 tesths. All rights reserved.</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>
================================================
FILE: TouTiaoLauncher/TouTiaoLauncher.entitlements
================================================
<?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/>
</dict>
</plist>
================================================
FILE: TouTiaoTests/Info.plist
================================================
<?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>en</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>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
================================================
FILE: TouTiaoTests/TouTiaoTests.swift
================================================
//
// TouTiaoTests.swift
// TouTiaoTests
//
// Created by tesths on 4/1/16.
// Copyright © 2016 tesths. All rights reserved.
//
import XCTest
@testable import TouTiao
class TouTiaoTests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
func testPerformanceExample() {
// This is an example of a performance test case.
self.measure {
// Put the code you want to measure the time of here.
}
}
}
================================================
FILE: TouTiaoUITests/Info.plist
================================================
<?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>en</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>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
================================================
FILE: TouTiaoUITests/TouTiaoUITests.swift
================================================
//
// TouTiaoUITests.swift
// TouTiaoUITests
//
// Created by tesths on 4/1/16.
// Copyright © 2016 tesths. All rights reserved.
//
import XCTest
class TouTiaoUITests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
// In UI tests it is usually best to stop immediately when a failure occurs.
continueAfterFailure = false
// UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
XCUIApplication().launch()
// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// Use recording to get started writing UI tests.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
}
gitextract_n5eo_kqa/
├── .gitignore
├── LICENSE
├── Podfile
├── README.md
├── TouTiao/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── StatusBarButtonImage.imageset/
│ │ │ └── Contents.json
│ │ ├── TouTiao.imageset/
│ │ │ └── Contents.json
│ │ ├── comment-icon.imageset/
│ │ │ └── Contents.json
│ │ ├── icon-settings.imageset/
│ │ │ └── Contents.json
│ │ ├── icon-upvote.imageset/
│ │ │ └── Contents.json
│ │ └── icon.imageset/
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ └── MainMenu.xib
│ ├── Extension/
│ │ ├── NSDate+Extension.swift
│ │ └── String+Extension.swift
│ ├── Info.plist
│ ├── MainViewController.swift
│ ├── Model/
│ │ └── TTModel.swift
│ ├── Network/
│ │ └── NetWorkFetcher.swift
│ ├── PopViewController.swift
│ ├── Service/
│ │ └── EventMonitor.swift
│ ├── TouTiao.entitlements
│ └── View/
│ ├── PopViewController.swift
│ ├── PopViewController.xib
│ ├── SettingMenuAction.swift
│ ├── TTButton.swift
│ └── TTCell.swift
├── TouTiao.xcodeproj/
│ ├── project.pbxproj
│ └── project.xcworkspace/
│ └── contents.xcworkspacedata
├── TouTiao.xcworkspace/
│ └── contents.xcworkspacedata
├── TouTiaoLauncher/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ └── AppIcon.appiconset/
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ └── MainMenu.xib
│ ├── Info.plist
│ └── TouTiaoLauncher.entitlements
├── TouTiaoTests/
│ ├── Info.plist
│ └── TouTiaoTests.swift
└── TouTiaoUITests/
├── Info.plist
└── TouTiaoUITests.swift
Condensed preview — 40 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (156K chars).
[
{
"path": ".gitignore",
"chars": 242,
"preview": ".DS_Store \nbuild/ \n*.pbxuser \n!default.pbxuser \n*.mode1v3 \n!default.mode1v3 \n*.mode2v3 \n!default.mode2v3 \n*.perspectivev"
},
{
"path": "LICENSE",
"chars": 1077,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2013 Catch Inc.\n\nPermission is hereby granted, free of charge, to any person obtain"
},
{
"path": "Podfile",
"chars": 72,
"preview": "use_frameworks!\n\ntarget 'TouTiao' do\n pod 'Alamofire'\n pod 'Fuzi'\nend\n"
},
{
"path": "README.md",
"chars": 675,
"preview": "# 开发者头条Mac端插件\n\n下载移步 [release](https://github.com/judi0713/TouTiao/releases)\n\n博客 [开发者头条插件小记](http://walkginkgo.com/ios/"
},
{
"path": "TouTiao/AppDelegate.swift",
"chars": 1392,
"preview": "//\n// AppDelegate.swift\n// TouTiao\n//\n// Created by tesths on 4/1/16.\n// Copyright © 2016 tesths. All rights reserve"
},
{
"path": "TouTiao/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1281,
"preview": "{\n \"images\" : [\n {\n \"size\" : \"16x16\",\n \"idiom\" : \"mac\",\n \"filename\" : \"开发者头条圆角矩形-7.png\",\n \"scale"
},
{
"path": "TouTiao/Assets.xcassets/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "TouTiao/Assets.xcassets/StatusBarButtonImage.imageset/Contents.json",
"chars": 280,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"mac\"\n },\n {\n \"idiom\" : \"mac\",\n \"scale\" : \"1x\"\n },\n {\n "
},
{
"path": "TouTiao/Assets.xcassets/TouTiao.imageset/Contents.json",
"chars": 301,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"mac\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"mac\",\n \"filename\" "
},
{
"path": "TouTiao/Assets.xcassets/comment-icon.imageset/Contents.json",
"chars": 237,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"mac\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"mac\",\n \"filename\" "
},
{
"path": "TouTiao/Assets.xcassets/icon-settings.imageset/Contents.json",
"chars": 235,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"mac\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"mac\",\n \"filename\" "
},
{
"path": "TouTiao/Assets.xcassets/icon-upvote.imageset/Contents.json",
"chars": 226,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"mac\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"mac\",\n \"filename\" "
},
{
"path": "TouTiao/Assets.xcassets/icon.imageset/Contents.json",
"chars": 315,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"apple-icon-180x180.png\",\n \"scale\" : \"1x\"\n "
},
{
"path": "TouTiao/Base.lproj/MainMenu.xib",
"chars": 1106,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3"
},
{
"path": "TouTiao/Extension/NSDate+Extension.swift",
"chars": 992,
"preview": "//\n// NSDate+Extension.swift\n// TouTiao\n//\n// Created by plusub on 4/26/16.\n// Copyright © 2016 tesths. All rights r"
},
{
"path": "TouTiao/Extension/String+Extension.swift",
"chars": 234,
"preview": "//\n// String+Extension.swift\n// NotLonely-iOS\n//\n// Created by plusub on 3/16/16.\n// Copyright © 2016 cm. All rights"
},
{
"path": "TouTiao/Info.plist",
"chars": 1291,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "TouTiao/MainViewController.swift",
"chars": 2280,
"preview": "//\n// MainViewController.swift\n// TouTiao\n//\n// Created by tesths on 4/1/16.\n// Copyright © 2016 tesths. All rights "
},
{
"path": "TouTiao/Model/TTModel.swift",
"chars": 270,
"preview": "//\n// TTModel.swift\n// TouTiao\n//\n// Created by tesths on 4/11/16.\n// Copyright © 2016 tesths. All rights reserved.\n"
},
{
"path": "TouTiao/Network/NetWorkFetcher.swift",
"chars": 2555,
"preview": "//\n// NetWorkFetcher.swift\n// TouTiao\n//\n// Created by tesths on 4/11/16.\n// Copyright © 2016 tesths. All rights res"
},
{
"path": "TouTiao/PopViewController.swift",
"chars": 1536,
"preview": "//\n// PopViewController.swift\n// TouTiao\n//\n// Created by tesths on 4/1/16.\n// Copyright © 2016 tesths. All rights r"
},
{
"path": "TouTiao/Service/EventMonitor.swift",
"chars": 752,
"preview": "//\n// EventMonitor.swift\n// TouTiao\n//\n// Created by plusub on 4/22/16.\n// Copyright © 2016 tesths. All rights reser"
},
{
"path": "TouTiao/TouTiao.entitlements",
"chars": 295,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "TouTiao/View/PopViewController.swift",
"chars": 3186,
"preview": "//\n// PopViewController.swift\n// TouTiao\n//\n// Created by tesths on 4/1/16.\n// Copyright © 2016 tesths. All rights r"
},
{
"path": "TouTiao/View/PopViewController.xib",
"chars": 23762,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
},
{
"path": "TouTiao/View/SettingMenuAction.swift",
"chars": 1592,
"preview": "//\n// SettingMenuAction.swift\n// TouTiao\n//\n// Created by plusub on 4/26/16.\n// Copyright © 2016 tesths. All rights "
},
{
"path": "TouTiao/View/TTButton.swift",
"chars": 1126,
"preview": "//\n// TTButton.swift\n// TouTiao\n//\n// Created by tesths on 25/03/2017.\n// Copyright © 2017 tesths. All rights reserv"
},
{
"path": "TouTiao/View/TTCell.swift",
"chars": 904,
"preview": "//\n// TTCell.swift\n// TouTiao\n//\n// Created by plusub on 4/24/16.\n// Copyright © 2016 tesths. All rights reserved.\n/"
},
{
"path": "TouTiao.xcodeproj/project.pbxproj",
"chars": 36049,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "TouTiao.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 152,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:TouTiao.xcodepr"
},
{
"path": "TouTiao.xcworkspace/contents.xcworkspacedata",
"chars": 225,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:TouTiao.xcodep"
},
{
"path": "TouTiaoLauncher/AppDelegate.swift",
"chars": 1572,
"preview": "//\n// AppDelegate.swift\n// TouTiaoLauncher\n//\n// Created by tesths on 25/03/2017.\n// Copyright © 2017 tesths. All ri"
},
{
"path": "TouTiaoLauncher/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 903,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"mac\",\n \"size\" : \"16x16\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : "
},
{
"path": "TouTiaoLauncher/Base.lproj/MainMenu.xib",
"chars": 50634,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3"
},
{
"path": "TouTiaoLauncher/Info.plist",
"chars": 1062,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "TouTiaoLauncher/TouTiaoLauncher.entitlements",
"chars": 240,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "TouTiaoTests/Info.plist",
"chars": 733,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "TouTiaoTests/TouTiaoTests.swift",
"chars": 957,
"preview": "//\n// TouTiaoTests.swift\n// TouTiaoTests\n//\n// Created by tesths on 4/1/16.\n// Copyright © 2016 tesths. All rights r"
},
{
"path": "TouTiaoUITests/Info.plist",
"chars": 733,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "TouTiaoUITests/TouTiaoUITests.swift",
"chars": 1230,
"preview": "//\n// TouTiaoUITests.swift\n// TouTiaoUITests\n//\n// Created by tesths on 4/1/16.\n// Copyright © 2016 tesths. All righ"
}
]
About this extraction
This page contains the full source code of the judi0713/TouTiao GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 40 files (139.4 KB), approximately 35.7k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.