unit tests build (not pass)

This commit is contained in:
Ryan Nystrom
2017-07-26 21:02:31 -06:00
parent bcc459530d
commit 60535c389d
13 changed files with 291 additions and 498 deletions

View File

@@ -134,11 +134,11 @@ func typeNeedsNewline(type: MMElementType) -> Bool {
func createModel(markdown: String, element: MMElement) -> ListDiffable? {
switch element.type {
case .codeBlock:
return element.codeBlock(markdown: markdown)
return CreateCodeBlock(element: element, markdown: markdown)
case .image:
return element.imageModel
return CreateImageModel(element: element)
case .table:
return element.table(markdown: markdown)
return CreateTable(element: element, markdown: markdown)
case .HTML:
guard let html = markdown.substring(with: element.range),
html.characters.count > 0
@@ -173,7 +173,7 @@ func travelAST(
let nextQuoteLevel = quoteLevel + (isQuote ? 1 : 0)
// push more text attributes on the stack the deeper we go
let pushedAttributes = element.attributes(currentAttributes: attributeStack, listLevel: nextListLevel)
let pushedAttributes = PushAttributes(element: element, current: attributeStack, listLevel: nextListLevel)
if typeNeedsNewline(type: element.type) {
attributedString.append(NSAttributedString(string: newlineString, attributes: pushedAttributes))

View File

@@ -11,81 +11,73 @@ import MMMarkdown
let MarkdownURLName = "MarkdownURLName"
extension MMElement {
func PushAttributes(element: MMElement, current: [String: Any], listLevel: Int) -> [String: Any] {
let currentFont: UIFont = current[NSFontAttributeName] as? UIFont ?? Styles.Fonts.body
func attributes(
currentAttributes: [String: Any],
listLevel: Int
) -> [String: Any] {
let currentFont: UIFont = currentAttributes[NSFontAttributeName] as? UIFont ?? Styles.Fonts.body
let currentPara: NSMutableParagraphStyle
if let para = (currentAttributes[NSParagraphStyleAttributeName] as? NSParagraphStyle)?.mutableCopy() as? NSMutableParagraphStyle {
currentPara = para
} else {
currentPara = NSMutableParagraphStyle()
}
var newAttributes: [String: Any]
switch type {
case .strikethrough: newAttributes = [
NSStrikethroughStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue,
NSStrikethroughColorAttributeName: currentAttributes[NSForegroundColorAttributeName] ?? Styles.Colors.Gray.dark.color,
]
case .strong: newAttributes = [
NSFontAttributeName: currentFont.addingTraits(traits: .traitBold),
]
case .em: newAttributes = [
NSFontAttributeName: currentFont.addingTraits(traits: .traitItalic),
]
case .codeSpan: newAttributes = [
NSFontAttributeName: Styles.Fonts.code,
NSBackgroundColorAttributeName: Styles.Colors.Gray.lighter.color,
NSForegroundColorAttributeName: Styles.Colors.Gray.dark.color,
UsernameDisabledAttributeName: true,
]
case .link: newAttributes = [
NSForegroundColorAttributeName: Styles.Colors.Blue.medium.color,
MarkdownURLName: href ?? "",
]
case .header:
switch level {
case 1: newAttributes = [
NSFontAttributeName: UIFont.boldSystemFont(ofSize: Styles.Sizes.Text.h1),
]
case 2: newAttributes = [
NSFontAttributeName: UIFont.boldSystemFont(ofSize: Styles.Sizes.Text.h2),
]
case 3: newAttributes = [
NSFontAttributeName: UIFont.boldSystemFont(ofSize: Styles.Sizes.Text.h3),
]
case 4: newAttributes = [
NSFontAttributeName: UIFont.boldSystemFont(ofSize: Styles.Sizes.Text.h4),
]
case 5: newAttributes = [
NSFontAttributeName: UIFont.boldSystemFont(ofSize: Styles.Sizes.Text.h5),
]
default: newAttributes = [
NSForegroundColorAttributeName: Styles.Colors.Gray.medium.color,
NSFontAttributeName: UIFont.boldSystemFont(ofSize: Styles.Sizes.Text.h6),
]
}
case .bulletedList, .numberedList:
let indent: CGFloat = (CGFloat(listLevel) - 1) * 18
currentPara.firstLineHeadIndent = indent
currentPara.firstLineHeadIndent = indent
newAttributes = [NSParagraphStyleAttributeName: currentPara]
case .blockquote: newAttributes = [
NSForegroundColorAttributeName: Styles.Colors.Gray.medium.color
]
default: newAttributes = [:]
}
var attributes = currentAttributes
for (k, v) in newAttributes {
attributes[k] = v
}
return attributes
let currentPara: NSMutableParagraphStyle
if let para = (current[NSParagraphStyleAttributeName] as? NSParagraphStyle)?.mutableCopy() as? NSMutableParagraphStyle {
currentPara = para
} else {
currentPara = NSMutableParagraphStyle()
}
var newAttributes: [String: Any]
switch element.type {
case .strikethrough: newAttributes = [
NSStrikethroughStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue,
NSStrikethroughColorAttributeName: current[NSForegroundColorAttributeName] ?? Styles.Colors.Gray.dark.color,
]
case .strong: newAttributes = [
NSFontAttributeName: currentFont.addingTraits(traits: .traitBold),
]
case .em: newAttributes = [
NSFontAttributeName: currentFont.addingTraits(traits: .traitItalic),
]
case .codeSpan: newAttributes = [
NSFontAttributeName: Styles.Fonts.code,
NSBackgroundColorAttributeName: Styles.Colors.Gray.lighter.color,
NSForegroundColorAttributeName: Styles.Colors.Gray.dark.color,
UsernameDisabledAttributeName: true,
]
case .link: newAttributes = [
NSForegroundColorAttributeName: Styles.Colors.Blue.medium.color,
MarkdownURLName: element.href ?? "",
]
case .header:
switch element.level {
case 1: newAttributes = [
NSFontAttributeName: UIFont.boldSystemFont(ofSize: Styles.Sizes.Text.h1),
]
case 2: newAttributes = [
NSFontAttributeName: UIFont.boldSystemFont(ofSize: Styles.Sizes.Text.h2),
]
case 3: newAttributes = [
NSFontAttributeName: UIFont.boldSystemFont(ofSize: Styles.Sizes.Text.h3),
]
case 4: newAttributes = [
NSFontAttributeName: UIFont.boldSystemFont(ofSize: Styles.Sizes.Text.h4),
]
case 5: newAttributes = [
NSFontAttributeName: UIFont.boldSystemFont(ofSize: Styles.Sizes.Text.h5),
]
default: newAttributes = [
NSForegroundColorAttributeName: Styles.Colors.Gray.medium.color,
NSFontAttributeName: UIFont.boldSystemFont(ofSize: Styles.Sizes.Text.h6),
]
}
case .bulletedList, .numberedList:
let indent: CGFloat = (CGFloat(listLevel) - 1) * 18
currentPara.firstLineHeadIndent = indent
currentPara.firstLineHeadIndent = indent
newAttributes = [NSParagraphStyleAttributeName: currentPara]
case .blockquote: newAttributes = [
NSForegroundColorAttributeName: Styles.Colors.Gray.medium.color
]
default: newAttributes = [:]
}
var attributes = current
for (k, v) in newAttributes {
attributes[k] = v
}
return attributes
}

View File

@@ -9,35 +9,31 @@
import UIKit
import MMMarkdown
extension MMElement {
func CreateCodeBlock(element: MMElement, markdown: String) -> IssueCommentCodeBlockModel {
// create the text from all 1d "none" child elements
// code blocks should not have any other child element type aside from "entity", which is skipped
let text = element.children.reduce("") {
guard $1.type == .none else { return $0 }
return $0 + substringOrNewline(text: markdown, range: $1.range)
}.trimmingCharacters(in: .whitespacesAndNewlines)
func codeBlock(markdown: String) -> IssueCommentCodeBlockModel {
// create the text from all 1d "none" child elements
// code blocks should not have any other child element type aside from "entity", which is skipped
let text = children.reduce("") {
guard $1.type == .none else { return $0 }
return $0 + substringOrNewline(text: markdown, range: $1.range)
}.trimmingCharacters(in: .whitespacesAndNewlines)
var inset = IssueCommentCodeBlockCell.textViewInset
inset.left += IssueCommentCodeBlockCell.scrollViewInset.left
inset.right += IssueCommentCodeBlockCell.scrollViewInset.right
var inset = IssueCommentCodeBlockCell.textViewInset
inset.left += IssueCommentCodeBlockCell.scrollViewInset.left
inset.right += IssueCommentCodeBlockCell.scrollViewInset.right
let attributes: [String: Any] = [
NSForegroundColorAttributeName: Styles.Colors.Gray.dark.color,
NSFontAttributeName: Styles.Fonts.code
]
let stringSizing = NSAttributedStringSizing(
containerWidth: 0,
attributedText: NSAttributedString(string: text, attributes: attributes),
inset: inset,
backgroundColor: Styles.Colors.Gray.lighter.color
)
return IssueCommentCodeBlockModel(
code: stringSizing,
language: language
)
}
let attributes: [String: Any] = [
NSForegroundColorAttributeName: Styles.Colors.Gray.dark.color,
NSFontAttributeName: Styles.Fonts.code
]
let stringSizing = NSAttributedStringSizing(
containerWidth: 0,
attributedText: NSAttributedString(string: text, attributes: attributes),
inset: inset,
backgroundColor: Styles.Colors.Gray.lighter.color
)
return IssueCommentCodeBlockModel(
code: stringSizing,
language: element.language
)
}

View File

@@ -9,11 +9,7 @@
import Foundation
import MMMarkdown
extension MMElement {
var imageModel: IssueCommentImageModel? {
guard let href = self.href, let url = URL(string: href) else { return nil }
return IssueCommentImageModel(url: url)
}
func CreateImageModel(element: MMElement) -> IssueCommentImageModel? {
guard let href = element.href, let url = URL(string: href) else { return nil }
return IssueCommentImageModel(url: url)
}

View File

@@ -6,119 +6,114 @@
// Copyright © 2017 Ryan Nystrom. All rights reserved.
//
import Foundation
import UIKit
import MMMarkdown
extension MMElement {
private typealias Row = IssueCommentTableModel.Row
private class TableBucket {
var rows = [Row]()
var maxWidth: CGFloat = 0
}
private func buildAttributedString(
markdown: String,
element: MMElement,
attributes: [String: Any],
attributedString: NSMutableAttributedString
) {
switch element.type {
case .none, .entity:
if let substr = markdown.substring(with: element.range) {
attributedString.append(NSAttributedString(string: substr, attributes: attributes))
}
default:
let childAttributes = element.attributes(currentAttributes: attributes, listLevel: 0)
for child in element.children {
buildAttributedString(
markdown: markdown,
element: child,
attributes: childAttributes,
attributedString: attributedString
)
}
private func buildAttributedString(
markdown: String,
element: MMElement,
attributes: [String: Any],
attributedString: NSMutableAttributedString
) {
switch element.type {
case .none, .entity:
if let substr = markdown.substring(with: element.range) {
attributedString.append(NSAttributedString(string: substr, attributes: attributes))
}
}
private func rowModels(
markdown: String,
element: MMElement,
attributes: [String: Any],
fill: Bool
) -> [NSAttributedStringSizing] {
var results = [NSAttributedStringSizing]()
default:
let childAttributes = PushAttributes(element: element, current: attributes, listLevel: 0)
for child in element.children {
guard child.type == .tableRowCell || child.type == .tableHeaderCell else { continue }
let attributedString = NSMutableAttributedString()
buildAttributedString(
markdown: markdown,
element: child,
attributes: attributes,
attributes: childAttributes,
attributedString: attributedString
)
results.append(NSAttributedStringSizing(
containerWidth: 0,
attributedText: attributedString,
inset: IssueCommentTableCollectionCell.inset,
backgroundColor: fill ? Styles.Colors.Gray.lighter.color : .white
))
}
return results
}
func table(markdown: String) -> IssueCommentTableModel {
guard type == .table else { fatalError("Calling table on non table element") }
typealias Row = IssueCommentTableModel.Row
class Bucket {
var rows = [Row]()
var maxWidth: CGFloat = 0
}
var buckets = [Bucket]()
var baseAttributes: [String: Any] = [
NSForegroundColorAttributeName: Styles.Colors.Gray.dark.color,
NSBackgroundColorAttributeName: UIColor.white,
]
var rowCount = 0
for row in children {
switch row.type {
case .tableHeader:
baseAttributes[NSFontAttributeName] = Styles.Fonts.bodyBold
case .tableRow:
rowCount += 1
baseAttributes[NSFontAttributeName] = Styles.Fonts.body
default: continue
}
let fill = rowCount > 0 && rowCount % 2 == 0
baseAttributes[NSBackgroundColorAttributeName] = fill ? Styles.Colors.Gray.lighter.color : .white
let models = rowModels(markdown: markdown, element: row, attributes: baseAttributes, fill: fill)
// prepopulate the buckets in case this is the first pass
while buckets.count < models.count {
buckets.append(Bucket())
}
// move text models from a row collection and place into column
for (i, model) in models.enumerated() {
let bucket = buckets[i]
bucket.rows.append(Row(text: model, fill: fill))
// adjust the max width of each column using whatever is the largest so all cells are the same width
bucket.maxWidth = max(bucket.maxWidth, model.textViewSize(0).width)
}
}
return IssueCommentTableModel(
columns: buckets.map { IssueCommentTableModel.Column(width: $0.maxWidth, rows: $0.rows) }
)
}
}
private func rowModels(
markdown: String,
element: MMElement,
attributes: [String: Any],
fill: Bool
) -> [NSAttributedStringSizing] {
var results = [NSAttributedStringSizing]()
for child in element.children {
guard child.type == .tableRowCell || child.type == .tableHeaderCell else { continue }
let attributedString = NSMutableAttributedString()
buildAttributedString(
markdown: markdown,
element: child,
attributes: attributes,
attributedString: attributedString
)
results.append(NSAttributedStringSizing(
containerWidth: 0,
attributedText: attributedString,
inset: IssueCommentTableCollectionCell.inset,
backgroundColor: fill ? Styles.Colors.Gray.lighter.color : .white
))
}
return results
}
func CreateTable(element: MMElement, markdown: String) -> IssueCommentTableModel {
guard element.type == .table else { fatalError("Calling table on non table element") }
var buckets = [TableBucket]()
var baseAttributes: [String: Any] = [
NSForegroundColorAttributeName: Styles.Colors.Gray.dark.color,
NSBackgroundColorAttributeName: UIColor.white,
]
var rowCount = 0
for row in element.children {
switch row.type {
case .tableHeader:
baseAttributes[NSFontAttributeName] = Styles.Fonts.bodyBold
case .tableRow:
rowCount += 1
baseAttributes[NSFontAttributeName] = Styles.Fonts.body
default: continue
}
let fill = rowCount > 0 && rowCount % 2 == 0
baseAttributes[NSBackgroundColorAttributeName] = fill ? Styles.Colors.Gray.lighter.color : .white
let models = rowModels(markdown: markdown, element: row, attributes: baseAttributes, fill: fill)
// prepopulate the buckets in case this is the first pass
while buckets.count < models.count {
buckets.append(TableBucket())
}
// move text models from a row collection and place into column
for (i, model) in models.enumerated() {
let bucket = buckets[i]
bucket.rows.append(Row(text: model, fill: fill))
// adjust the max width of each column using whatever is the largest so all cells are the same width
bucket.maxWidth = max(bucket.maxWidth, model.textViewSize(0).width)
}
}
return IssueCommentTableModel(
columns: buckets.map { IssueCommentTableModel.Column(width: $0.maxWidth, rows: $0.rows) }
)
}

View File

@@ -11,7 +11,7 @@ import Foundation
// https://stackoverflow.com/a/38738940/940936
extension NSAttributedString {
func attributedStringByTrimmingCharacterSet(charSet: CharacterSet) -> NSAttributedString {
public func attributedStringByTrimmingCharacterSet(charSet: CharacterSet) -> NSAttributedString {
let modifiedString = NSMutableAttributedString(attributedString: self)
modifiedString.trimCharactersInSet(charSet: charSet)
return NSAttributedString(attributedString: modifiedString)
@@ -21,11 +21,11 @@ extension NSAttributedString {
extension NSMutableAttributedString {
func removeAll() {
public func removeAll() {
deleteCharacters(in: string.nsrange)
}
func trimCharactersInSet(charSet: CharacterSet) {
public func trimCharactersInSet(charSet: CharacterSet) {
var range = (string as NSString).rangeOfCharacter(from: charSet)
// Trim leading characters from character set.

View File

@@ -105,8 +105,10 @@ enum Styles {
}
extension String {
var color: UIColor {
public var color: UIColor {
return UIColor.fromHex(self)
}
}

View File

@@ -11,7 +11,7 @@ import UIKit
extension UIColor {
// http://stackoverflow.com/a/27203691/940936
static func fromHex(_ hex: String) -> UIColor {
public static func fromHex(_ hex: String) -> UIColor {
var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
if (cString.hasPrefix("#")) {

View File

@@ -11,7 +11,7 @@ import SnapKit
extension UIView {
enum Position {
public enum Position {
case left
case top
case right
@@ -19,7 +19,7 @@ extension UIView {
}
@discardableResult
func addBorder(
public func addBorder(
_ position: Position,
left: CGFloat = 0,
right: CGFloat = 0,

View File

@@ -19,9 +19,7 @@
290D2A3F1F0466820082E6CC /* NotificationNavigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290D2A3E1F0466820082E6CC /* NotificationNavigation.swift */; };
290D2A421F04D3470082E6CC /* IssueStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290D2A411F04D3470082E6CC /* IssueStatus.swift */; };
290EF5661F06A797006A2160 /* Notifications+Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290EF5651F06A794006A2160 /* Notifications+Filter.swift */; };
290EF5671F06A798006A2160 /* Notifications+Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290EF5651F06A794006A2160 /* Notifications+Filter.swift */; };
290EF56A1F06A821006A2160 /* Notification+NotificationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290EF5691F06A7E1006A2160 /* Notification+NotificationViewModel.swift */; };
290EF56B1F06A821006A2160 /* Notification+NotificationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290EF5691F06A7E1006A2160 /* Notification+NotificationViewModel.swift */; };
290EF5761F06BA06006A2160 /* NoNewNotificationsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290EF5751F06BA06006A2160 /* NoNewNotificationsCell.swift */; };
290EF5791F06BAF4006A2160 /* NoNewNotificationsSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290EF5781F06BAF4006A2160 /* NoNewNotificationsSectionController.swift */; };
291F99D71EFFFA2600CFBF78 /* SettingsReportSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 291F99D61EFFFA2600CFBF78 /* SettingsReportSectionController.swift */; };
@@ -84,6 +82,39 @@
29316DCB1ECCA581007CAE3F /* SettingsSignoutSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29316DCA1ECCA581007CAE3F /* SettingsSignoutSectionController.swift */; };
29316DCD1ECD31E9007CAE3F /* StatusBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29316DCC1ECD31E9007CAE3F /* StatusBar.swift */; };
2931EA471EF7734B00AEE0FF /* String+NSRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2931EA461EF7734B00AEE0FF /* String+NSRange.swift */; };
293A45751F296B7E00DD1006 /* DateDisplayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297AE84C1EC0D58A00B44A1F /* DateDisplayTests.swift */; };
293A45761F296B7E00DD1006 /* IssueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A476B11ED24D99005D0953 /* IssueTests.swift */; };
293A45771F296B7E00DD1006 /* ListKitTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C2950D1EC7B43B00D46CD2 /* ListKitTestCase.swift */; };
293A45781F296B7E00DD1006 /* ListTestKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C295091EC7AFA500D46CD2 /* ListTestKit.swift */; };
293A45791F296B7E00DD1006 /* MMMarkdownASTTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295F52A81EF1B9E2000B53CF /* MMMarkdownASTTests.swift */; };
293A457A1F296B7E00DD1006 /* EmojiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2981A8A61EFEBEF900E25EF1 /* EmojiTests.swift */; };
293A457D1F296BD200DD1006 /* NSAttributedStringSizing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298BA08C1EC90A9000B01946 /* NSAttributedStringSizing.swift */; };
293A457E1F296BD500DD1006 /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCB2B1EE054900026635E /* API.swift */; };
293A457F1F296BE200DD1006 /* Date+Display.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A195031EC74C4800C3E289 /* Date+Display.swift */; };
293A45801F296BEA00DD1006 /* GithubEmoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2981A8A31EFE9FC700E25EF1 /* GithubEmoji.swift */; };
293A45821F296CA000DD1006 /* IssueCommentQuoteModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295840D71EEA0686007723C6 /* IssueCommentQuoteModel.swift */; };
293A45831F296CAF00DD1006 /* Styles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C9FDE01EC667AE00EE3A52 /* Styles.swift */; };
293A45851F296CE200DD1006 /* IssueCommentCodeBlockModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCACB1EDFCC510026635E /* IssueCommentCodeBlockModel.swift */; };
293A458B1F296CF300DD1006 /* CommentModelsFromMarkdown.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295F52AC1EF1BE83000B53CF /* CommentModelsFromMarkdown.swift */; };
293A458C1F296CF300DD1006 /* MMElement+Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29921BC91EF6233200C1E848 /* MMElement+Attributes.swift */; };
293A458D1F296CF300DD1006 /* MMElement+CodeBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29921BCF1EF6261C00C1E848 /* MMElement+CodeBlock.swift */; };
293A458E1F296CF300DD1006 /* MMElement+Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29921BCD1EF624F500C1E848 /* MMElement+Image.swift */; };
293A458F1F296CF300DD1006 /* MMElement+Table.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297406A01F0EE51E003A6BFB /* MMElement+Table.swift */; };
293A45901F296CF300DD1006 /* NSAttributedString+Trim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29CD71161EF22F4200616E85 /* NSAttributedString+Trim.swift */; };
293A45911F296CF300DD1006 /* String+NSRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2931EA461EF7734B00AEE0FF /* String+NSRange.swift */; };
293A45921F296CF300DD1006 /* UIFont+MutableTraits.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29921BCB1EF624D400C1E848 /* UIFont+MutableTraits.swift */; };
293A45931F296D4E00DD1006 /* IssueCommentCodeBlockCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCACA1EDFCC510026635E /* IssueCommentCodeBlockCell.swift */; };
293A45941F296D5B00DD1006 /* CollapsibleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCACC1EDFCC510026635E /* CollapsibleCell.swift */; };
293A45951F296D8E00DD1006 /* IssueCommentImageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAD21EDFCC510026635E /* IssueCommentImageModel.swift */; };
293A45961F298C9500DD1006 /* UIColor+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A195011EC66B8B00C3E289 /* UIColor+Hex.swift */; };
293A45971F298D4B00DD1006 /* IssueCommentTableModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2974069A1F0EDC7C003A6BFB /* IssueCommentTableModel.swift */; };
293A45981F298D5700DD1006 /* IssueCommentTableCollectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2974069E1F0EDED3003A6BFB /* IssueCommentTableCollectionCell.swift */; };
293A45991F298D8400DD1006 /* AttributedStringView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 299E86421EFD8D8200E5FE70 /* AttributedStringView.swift */; };
293A459B1F298E7D00DD1006 /* IssueCommentSummaryModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAE21EDFCC510026635E /* IssueCommentSummaryModel.swift */; };
293A459C1F298E9700DD1006 /* IssueCommentTextCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAE41EDFCC510026635E /* IssueCommentTextCell.swift */; };
293A459D1F298EDB00DD1006 /* IssueCommentQuoteCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295840D91EEA07E4007723C6 /* IssueCommentQuoteCell.swift */; };
293A459E1F298EE200DD1006 /* IssueCommentHrModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2949674B1EF9716400B1CF1A /* IssueCommentHrModel.swift */; };
293A459F1F298EED00DD1006 /* IssueCommentHtmlModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294967501EFC1E9E00B1CF1A /* IssueCommentHtmlModel.swift */; };
293B58531EF808DA001D067D /* IssueCommentUnsupportedModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293B58521EF808DA001D067D /* IssueCommentUnsupportedModel.swift */; };
293B58551EF80908001D067D /* IssueCommentUnsupportedCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293B58541EF80908001D067D /* IssueCommentUnsupportedCell.swift */; };
29416BF91F1138B700D03E1A /* OauthLogin.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 29416BF81F1138B700D03E1A /* OauthLogin.storyboard */; };
@@ -106,97 +137,21 @@
2958406D1EE8EBF3007723C6 /* IssueCommentPhoto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2958406C1EE8EBF3007723C6 /* IssueCommentPhoto.swift */; };
2958406F1EE9F21E007723C6 /* UIButton+Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2958406E1EE9F21E007723C6 /* UIButton+Label.swift */; };
295840711EE9F4D3007723C6 /* ShowMoreDetailsLabel+Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295840701EE9F4D3007723C6 /* ShowMoreDetailsLabel+Date.swift */; };
295840721EEA00E1007723C6 /* IssueStatusEventCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295840661EE89FE4007723C6 /* IssueStatusEventCell.swift */; };
295840731EEA00E1007723C6 /* IssueStatusEventModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295840641EE89F28007723C6 /* IssueStatusEventModel.swift */; };
295840741EEA00E1007723C6 /* IssueStatusEventSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295840681EE8A328007723C6 /* IssueStatusEventSectionController.swift */; };
295840751EEA00E1007723C6 /* IssueCommentCodeBlockCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCACA1EDFCC510026635E /* IssueCommentCodeBlockCell.swift */; };
295840761EEA00E1007723C6 /* IssueCommentCodeBlockModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCACB1EDFCC510026635E /* IssueCommentCodeBlockModel.swift */; };
295840771EEA00E1007723C6 /* CollapsibleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCACC1EDFCC510026635E /* CollapsibleCell.swift */; };
295840781EEA00E1007723C6 /* IssueCommentDetailCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCACE1EDFCC510026635E /* IssueCommentDetailCell.swift */; };
295840791EEA00E1007723C6 /* IssueCommentDetailsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCACF1EDFCC510026635E /* IssueCommentDetailsViewModel.swift */; };
2958407A1EEA00E1007723C6 /* IssueCommentImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAD11EDFCC510026635E /* IssueCommentImageCell.swift */; };
2958407B1EEA00E1007723C6 /* IssueCommentImageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAD21EDFCC510026635E /* IssueCommentImageModel.swift */; };
2958407C1EEA00E1007723C6 /* IssueCommentPhoto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2958406C1EE8EBF3007723C6 /* IssueCommentPhoto.swift */; };
2958407D1EEA00E1007723C6 /* IssueCollapsedBodies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAD31EDFCC510026635E /* IssueCollapsedBodies.swift */; };
2958407E1EEA00E1007723C6 /* IssueCommentModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAD41EDFCC510026635E /* IssueCommentModel.swift */; };
2958407F1EEA00E1007723C6 /* IssueCommentSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAD51EDFCC510026635E /* IssueCommentSectionController.swift */; };
295840871EEA00E1007723C6 /* IssueCommentReactionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCADF1EDFCC510026635E /* IssueCommentReactionCell.swift */; };
295840881EEA00E1007723C6 /* IssueCommentReactionViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCB1E1EDFCD750026635E /* IssueCommentReactionViewModel.swift */; };
295840891EEA00E1007723C6 /* IssueReactionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCB201EDFCF870026635E /* IssueReactionCell.swift */; };
2958408A1EEA00E1007723C6 /* ReactionContent+ReactionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29FF85A41EE1EA7A007B8762 /* ReactionContent+ReactionType.swift */; };
2958408B1EEA00E1007723C6 /* ReactionViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCB1C1EDFCD3D0026635E /* ReactionViewModel.swift */; };
2958408C1EEA00E1007723C6 /* UIMenuController+Reactions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2963A9311EE1EBE20066509C /* UIMenuController+Reactions.swift */; };
2958408D1EEA00E1007723C6 /* IssueCommentSummaryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAE11EDFCC510026635E /* IssueCommentSummaryCell.swift */; };
2958408E1EEA00E1007723C6 /* IssueCommentSummaryModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAE21EDFCC510026635E /* IssueCommentSummaryModel.swift */; };
2958408F1EEA00E1007723C6 /* IssueCommentTextCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAE41EDFCC510026635E /* IssueCommentTextCell.swift */; };
295840911EEA00E1007723C6 /* Issue+IssueType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294563EB1EE5012100DBCD35 /* Issue+IssueType.swift */; };
295840941EEA00E1007723C6 /* IssuesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAE91EDFCC510026635E /* IssuesViewController.swift */; };
295840951EEA00E1007723C6 /* IssueType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294563EF1EE5036A00DBCD35 /* IssueType.swift */; };
295840961EEA00E1007723C6 /* IssueViewModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAEA1EDFCC510026635E /* IssueViewModels.swift */; };
295840971EEA00E1007723C6 /* IssueLabeledCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29FB942F1EE752280016E6D4 /* IssueLabeledCell.swift */; };
295840981EEA00E1007723C6 /* IssueLabeledModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29FB942B1EE750DB0016E6D4 /* IssueLabeledModel.swift */; };
295840991EEA00E1007723C6 /* IssueLabeledSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29FB942D1EE751F70016E6D4 /* IssueLabeledSectionController.swift */; };
2958409A1EEA00E1007723C6 /* IssueLabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAED1EDFCC510026635E /* IssueLabelCell.swift */; };
2958409B1EEA00E1007723C6 /* IssueLabelDotCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAEE1EDFCC510026635E /* IssueLabelDotCell.swift */; };
2958409C1EEA00E1007723C6 /* IssueLabelsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAEF1EDFCC510026635E /* IssueLabelsModel.swift */; };
2958409D1EEA00E1007723C6 /* IssueLabelsSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAF01EDFCC510026635E /* IssueLabelsSectionController.swift */; };
2958409E1EEA00E1007723C6 /* IssueLabelSummaryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAF11EDFCC510026635E /* IssueLabelSummaryCell.swift */; };
2958409F1EEA00E1007723C6 /* IssueLabelSummaryModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAF21EDFCC510026635E /* IssueLabelSummaryModel.swift */; };
295840A01EEA00E1007723C6 /* IssueLabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29FF85A21EE1CFF7007B8762 /* IssueLabelModel.swift */; };
295840A11EEA00E1007723C6 /* PullRequest+IssueType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294563ED1EE5012900DBCD35 /* PullRequest+IssueType.swift */; };
295840A21EEA00E1007723C6 /* IssueStatusCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294563E91EE4EEF000DBCD35 /* IssueStatusCell.swift */; };
295840A31EEA00E1007723C6 /* IssueStatusModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294563E51EE4EE6F00DBCD35 /* IssueStatusModel.swift */; };
295840A41EEA00E1007723C6 /* IssueStatusSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294563E71EE4EED200DBCD35 /* IssueStatusSectionController.swift */; };
295840A51EEA00E1007723C6 /* IssueTitleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAF41EDFCC510026635E /* IssueTitleCell.swift */; };
295840A61EEA00E1007723C6 /* IssueTitleSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCAF51EDFCC510026635E /* IssueTitleSectionController.swift */; };
295840AC1EEA00E1007723C6 /* Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C9FDBA1EC65FEE00EE3A52 /* Notification.swift */; };
295840AD1EEA00E1007723C6 /* Organization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C9FDBB1EC65FEE00EE3A52 /* Organization.swift */; };
295840AE1EEA00E1007723C6 /* Permission.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C9FDBC1EC65FEE00EE3A52 /* Permission.swift */; };
295840AF1EEA00E1007723C6 /* Repository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C9FDBF1EC65FEE00EE3A52 /* Repository.swift */; };
295840B01EEA00E1007723C6 /* Subject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C9FDC31EC65FEE00EE3A52 /* Subject.swift */; };
295840B11EEA00E1007723C6 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C9FDC41EC65FEE00EE3A52 /* User.swift */; };
295840B21EEA00E1007723C6 /* LabelableFields+IssueLabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2963A93A1EE25F6F0066509C /* LabelableFields+IssueLabelModel.swift */; };
295840B41EEA00E1007723C6 /* NotificationsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C295151EC7BCCD00D46CD2 /* NotificationsViewController.swift */; };
295840B81EEA00E1007723C6 /* Secrets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297AE8631EC0D5C100B44A1F /* Secrets.swift */; };
295840B91EEA00E1007723C6 /* SegmentedControlCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298BA0951EC947F100B01946 /* SegmentedControlCell.swift */; };
295840BA1EEA00E1007723C6 /* SegmentedControlModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298BA0991EC947FC00B01946 /* SegmentedControlModel.swift */; };
295840BB1EEA00E1007723C6 /* SegmentedControlSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298BA0961EC947F100B01946 /* SegmentedControlSectionController.swift */; };
295840BE1EEA00E1007723C6 /* SettingsSignoutSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29316DCA1ECCA581007CAE3F /* SettingsSignoutSectionController.swift */; };
295840C31EEA00E1007723C6 /* Alamofire+GithubAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29316DC41ECC9841007CAE3F /* Alamofire+GithubAPI.swift */; };
295840C51EEA00E1007723C6 /* Feed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C167791ECA14F700439D62 /* Feed.swift */; };
295840C61EEA00E1007723C6 /* GithubClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C0E7061ECBC6C50051D756 /* GithubClient.swift */; };
295840C71EEA00E1007723C6 /* GithubSessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 299F2A111EC3BCF0006CE9D7 /* GithubSessionManager.swift */; };
295840C81EEA00E1007723C6 /* GithubUserSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29316DBC1ECC8970007CAE3F /* GithubUserSession.swift */; };
295840CA1EEA00E1007723C6 /* StatusBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29316DCC1ECD31E9007CAE3F /* StatusBar.swift */; };
295840CC1EEA00E1007723C6 /* UIViewController+Alerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297AE8691EC0D5C200B44A1F /* UIViewController+Alerts.swift */; };
295840CD1EEA00E1007723C6 /* UIViewController+LoadingIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297AE86A1EC0D5C200B44A1F /* UIViewController+LoadingIndicator.swift */; };
295840CE1EEA00E1007723C6 /* ButtonCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29316DB41ECC7DEB007CAE3F /* ButtonCell.swift */; };
295840CF1EEA00E1007723C6 /* ResponderButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2963A9331EE2118E0066509C /* ResponderButton.swift */; };
295840D01EEA00E1007723C6 /* ShowMoreDetailsLabel+Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295840701EE9F4D3007723C6 /* ShowMoreDetailsLabel+Date.swift */; };
295840D11EEA00E1007723C6 /* UIColor+Overlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A4769F1ED0E6C6005D0953 /* UIColor+Overlay.swift */; };
295840D21EEA00E1007723C6 /* UIButton+Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2958406E1EE9F21E007723C6 /* UIButton+Label.swift */; };
295840D31EEA00FB007723C6 /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292FCB2B1EE054900026635E /* API.swift */; };
295840D81EEA0686007723C6 /* IssueCommentQuoteModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295840D71EEA0686007723C6 /* IssueCommentQuoteModel.swift */; };
295840DA1EEA07E4007723C6 /* IssueCommentQuoteCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295840D91EEA07E4007723C6 /* IssueCommentQuoteCell.swift */; };
295840DB1EEA09B5007723C6 /* IssueCommentQuoteModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295840D71EEA0686007723C6 /* IssueCommentQuoteModel.swift */; };
295840DC1EEA09B5007723C6 /* IssueCommentQuoteCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295840D91EEA07E4007723C6 /* IssueCommentQuoteCell.swift */; };
295C31C71F09E62600521CED /* NotificationNextPageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295C31C61F09E62600521CED /* NotificationNextPageCell.swift */; };
295C31C91F09E72D00521CED /* NotificationNextPageSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295C31C81F09E72D00521CED /* NotificationNextPageSectionController.swift */; };
295C31CD1F0AA55400521CED /* IssueStatusEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295C31CC1F0AA55400521CED /* IssueStatusEvent.swift */; };
295C31CF1F0AA67600521CED /* IssueStatus+ButtonState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295C31CE1F0AA67600521CED /* IssueStatus+ButtonState.swift */; };
295C31D11F0AA72000521CED /* IssueStatusEvent+ButtonState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295C31D01F0AA72000521CED /* IssueStatusEvent+ButtonState.swift */; };
295F52A71EF1B9D2000B53CF /* Test.md in Sources */ = {isa = PBXBuildFile; fileRef = 295F52A61EF1B9D2000B53CF /* Test.md */; };
295F52A91EF1B9E2000B53CF /* MMMarkdownASTTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295F52A81EF1B9E2000B53CF /* MMMarkdownASTTests.swift */; };
295F52AA1EF1BB86000B53CF /* Test.md in Resources */ = {isa = PBXBuildFile; fileRef = 295F52A61EF1B9D2000B53CF /* Test.md */; };
295F52AD1EF1BE83000B53CF /* CommentModelsFromMarkdown.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295F52AC1EF1BE83000B53CF /* CommentModelsFromMarkdown.swift */; };
295F52DA1EF1C0C7000B53CF /* MMMarkdown.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 295F52D91EF1C0C7000B53CF /* MMMarkdown.framework */; };
295F52DB1EF1C0C7000B53CF /* MMMarkdown.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 295F52D91EF1C0C7000B53CF /* MMMarkdown.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
295F52E11EF1C2C9000B53CF /* CommentModelsFromMarkdown.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295F52AC1EF1BE83000B53CF /* CommentModelsFromMarkdown.swift */; };
2963A9321EE1EBE20066509C /* UIMenuController+Reactions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2963A9311EE1EBE20066509C /* UIMenuController+Reactions.swift */; };
2963A9341EE2118E0066509C /* ResponderButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2963A9331EE2118E0066509C /* ResponderButton.swift */; };
2963A93B1EE25F6F0066509C /* LabelableFields+IssueLabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2963A93A1EE25F6F0066509C /* LabelableFields+IssueLabelModel.swift */; };
296CD8291F0141A6001190B9 /* Samples.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296CD8281F0141A6001190B9 /* Samples.swift */; };
296CD82A1F0141A6001190B9 /* Samples.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296CD8281F0141A6001190B9 /* Samples.swift */; };
2971722B1F069E6B005E43AC /* SpinnerSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2971722A1F069E6B005E43AC /* SpinnerSectionController.swift */; };
2971722D1F069E96005E43AC /* SpinnerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2971722C1F069E96005E43AC /* SpinnerCell.swift */; };
297403D11F184F8D00ABA95A /* IssueAssigneesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297403D01F184F8D00ABA95A /* IssueAssigneesModel.swift */; };
@@ -214,7 +169,6 @@
297A372C1F1700BC0081C04E /* IssueRequestModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297A372B1F1700BC0081C04E /* IssueRequestModel.swift */; };
297A372E1F17018F0081C04E /* IssueRequestCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297A372D1F17018F0081C04E /* IssueRequestCell.swift */; };
297A37301F1704C10081C04E /* IssueRequestSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297A372F1F1704C10081C04E /* IssueRequestSectionController.swift */; };
297AE84D1EC0D58A00B44A1F /* DateDisplayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297AE84C1EC0D58A00B44A1F /* DateDisplayTests.swift */; };
297AE8791EC0D5C200B44A1F /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297AE85F1EC0D5C100B44A1F /* App.swift */; };
297AE87A1EC0D5C200B44A1F /* Authorization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297AE8601EC0D5C100B44A1F /* Authorization.swift */; };
297AE87C1EC0D5C200B44A1F /* Secrets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297AE8631EC0D5C100B44A1F /* Secrets.swift */; };
@@ -226,35 +180,8 @@
297AE8831EC0D5C200B44A1F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 297AE8711EC0D5C200B44A1F /* Main.storyboard */; };
297DD5E11F061BBE006E7E63 /* CreateProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297DD5E01F061BBE006E7E63 /* CreateProfileViewController.swift */; };
297DD5E31F06922A006E7E63 /* NotificationClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297DD5E21F06922A006E7E63 /* NotificationClient.swift */; };
297DD5E71F06945C006E7E63 /* IssueStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290D2A411F04D3470082E6CC /* IssueStatus.swift */; };
297DD5F01F06948D006E7E63 /* NotificationClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297DD5E21F06922A006E7E63 /* NotificationClient.swift */; };
297DD5F11F06948D006E7E63 /* NotificationNavigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290D2A3E1F0466820082E6CC /* NotificationNavigation.swift */; };
297DD5F31F069497006E7E63 /* SettingsReportSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 291F99D61EFFFA2600CFBF78 /* SettingsReportSectionController.swift */; };
297DD5F41F069497006E7E63 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C1677E1ECA1D7300439D62 /* SettingsViewController.swift */; };
297DD5F51F06949E006E7E63 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297AE8671EC0D5C200B44A1F /* AppDelegate.swift */; };
297DD5F61F06949E006E7E63 /* RootNavigationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29316DC21ECC981D007CAE3F /* RootNavigationManager.swift */; };
297DD5F71F0694A3006E7E63 /* RootViewControllers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29316DBE1ECC95DB007CAE3F /* RootViewControllers.swift */; };
297DD5F81F0694A3006E7E63 /* SplitViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29AC90E41F00A7C8000B80E4 /* SplitViewControllerDelegate.swift */; };
297DD5F91F0694A3006E7E63 /* UIViewController+SmartDeselection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290D2A3C1F044CB20082E6CC /* UIViewController+SmartDeselection.swift */; };
297DD5FA1F0694A3006E7E63 /* CreateProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297DD5E01F061BBE006E7E63 /* CreateProfileViewController.swift */; };
2980E0921F073E8B000E02C6 /* NotificationSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2980E0911F073E8B000E02C6 /* NotificationSectionController.swift */; };
2980E0931F073E8B000E02C6 /* NotificationSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2980E0911F073E8B000E02C6 /* NotificationSectionController.swift */; };
2981A8A41EFE9FC700E25EF1 /* GithubEmoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2981A8A31EFE9FC700E25EF1 /* GithubEmoji.swift */; };
2981A8A51EFEBEE300E25EF1 /* GithubEmoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2981A8A31EFE9FC700E25EF1 /* GithubEmoji.swift */; };
2981A8A71EFEBEF900E25EF1 /* EmojiTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2981A8A61EFEBEF900E25EF1 /* EmojiTests.swift */; };
2981A8A81EFF49DE00E25EF1 /* AttributedStringView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 299E86421EFD8D8200E5FE70 /* AttributedStringView.swift */; };
2981A8A91EFF49EE00E25EF1 /* MMElement+Attributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29921BC91EF6233200C1E848 /* MMElement+Attributes.swift */; };
2981A8AA1EFF49EE00E25EF1 /* MMElement+CodeBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29921BCF1EF6261C00C1E848 /* MMElement+CodeBlock.swift */; };
2981A8AB1EFF49EE00E25EF1 /* MMElement+Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29921BCD1EF624F500C1E848 /* MMElement+Image.swift */; };
2981A8AC1EFF49EE00E25EF1 /* NSAttributedString+Trim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29CD71161EF22F4200616E85 /* NSAttributedString+Trim.swift */; };
2981A8AD1EFF49EE00E25EF1 /* String+NSRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2931EA461EF7734B00AEE0FF /* String+NSRange.swift */; };
2981A8AE1EFF49EE00E25EF1 /* UIFont+MutableTraits.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29921BCB1EF624D400C1E848 /* UIFont+MutableTraits.swift */; };
2981A8AF1EFF4A0400E25EF1 /* IssueCommentHtmlCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294967521EFC1EDB00B1CF1A /* IssueCommentHtmlCell.swift */; };
2981A8B01EFF4A1100E25EF1 /* IssueCommentHrModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2949674B1EF9716400B1CF1A /* IssueCommentHrModel.swift */; };
2981A8B11EFF4A1100E25EF1 /* IssueCommentHrCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2949674D1EF9719300B1CF1A /* IssueCommentHrCell.swift */; };
2981A8B21EFF4A1500E25EF1 /* IssueCommentHtmlModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294967501EFC1E9E00B1CF1A /* IssueCommentHtmlModel.swift */; };
2981A8B31EFF4A2200E25EF1 /* IssueCommentUnsupportedModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293B58521EF808DA001D067D /* IssueCommentUnsupportedModel.swift */; };
2981A8B41EFF4A2200E25EF1 /* IssueCommentUnsupportedCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293B58541EF80908001D067D /* IssueCommentUnsupportedCell.swift */; };
298744CB1F24B75300D5DF30 /* SlackTextViewController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 298744CA1F24B75300D5DF30 /* SlackTextViewController.framework */; };
298744CC1F24B75300D5DF30 /* SlackTextViewController.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 298744CA1F24B75300D5DF30 /* SlackTextViewController.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
298BA08D1EC90A9000B01946 /* NSAttributedStringSizing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298BA08C1EC90A9000B01946 /* NSAttributedStringSizing.swift */; };
@@ -277,7 +204,6 @@
29A08FC11F12F08100C5368E /* String+HashDisplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A08FC01F12F08100C5368E /* String+HashDisplay.swift */; };
29A195021EC66B8B00C3E289 /* UIColor+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A195011EC66B8B00C3E289 /* UIColor+Hex.swift */; };
29A195041EC74C4800C3E289 /* Date+Display.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A195031EC74C4800C3E289 /* Date+Display.swift */; };
29A195051EC75F3D00C3E289 /* Date+Display.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A195031EC74C4800C3E289 /* Date+Display.swift */; };
29A195071EC7601000C3E289 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 29A195061EC7601000C3E289 /* Localizable.stringsdict */; };
29A195081EC7602500C3E289 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 29A195061EC7601000C3E289 /* Localizable.stringsdict */; };
29A1950A1EC78B4800C3E289 /* NotificationType+Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A195091EC78B4800C3E289 /* NotificationType+Icon.swift */; };
@@ -285,32 +211,13 @@
29A195111EC7AC9500C3E289 /* NotificationRepoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A195101EC7AC9500C3E289 /* NotificationRepoCell.swift */; };
29A4768E1ED07A23005D0953 /* DateDetailsFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A4768D1ED07A23005D0953 /* DateDetailsFormatter.swift */; };
29A476A01ED0E6C6005D0953 /* UIColor+Overlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A4769F1ED0E6C6005D0953 /* UIColor+Overlay.swift */; };
29A476A11ED23F83005D0953 /* DateDetailsFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A4768D1ED07A23005D0953 /* DateDetailsFormatter.swift */; };
29A476A51ED23FA2005D0953 /* Authorization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297AE8601EC0D5C100B44A1F /* Authorization.swift */; };
29A476A61ED23FAE005D0953 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297AE85F1EC0D5C100B44A1F /* App.swift */; };
29A476AA1ED24032005D0953 /* ListTestKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C295091EC7AFA500D46CD2 /* ListTestKit.swift */; };
29A476B21ED24D99005D0953 /* IssueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A476B11ED24D99005D0953 /* IssueTests.swift */; };
29AC90E51F00A7C8000B80E4 /* SplitViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29AC90E41F00A7C8000B80E4 /* SplitViewControllerDelegate.swift */; };
29C0E7071ECBC6C50051D756 /* GithubClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C0E7061ECBC6C50051D756 /* GithubClient.swift */; };
29C167671ECA005500439D62 /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C167661ECA005500439D62 /* Strings.swift */; };
29C167691ECA016500439D62 /* EmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C167681ECA016500439D62 /* EmptyView.swift */; };
29C167701ECA0D7C00439D62 /* EmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C167681ECA016500439D62 /* EmptyView.swift */; };
29C167711ECA0D7C00439D62 /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C167661ECA005500439D62 /* Strings.swift */; };
29C167721ECA0D7C00439D62 /* UIView+BottomBorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298BA08E1EC90FEE00B01946 /* UIView+BottomBorder.swift */; };
29C167741ECA0DBB00439D62 /* GithubAPIDateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C167731ECA0DBB00439D62 /* GithubAPIDateFormatter.swift */; };
29C167751ECA0DC300439D62 /* GithubAPIDateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C167731ECA0DBB00439D62 /* GithubAPIDateFormatter.swift */; };
29C167761ECA0DE100439D62 /* NSAttributedStringSizing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298BA08C1EC90A9000B01946 /* NSAttributedStringSizing.swift */; };
29C1677A1ECA14F700439D62 /* Feed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C167791ECA14F700439D62 /* Feed.swift */; };
29C1677F1ECA1D7300439D62 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C1677E1ECA1D7300439D62 /* SettingsViewController.swift */; };
29C295021EC7AF8C00D46CD2 /* NotificationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C9FDDA1EC6627200EE3A52 /* NotificationCell.swift */; };
29C295031EC7AF8C00D46CD2 /* NotificationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C9FDDC1EC6628200EE3A52 /* NotificationViewModel.swift */; };
29C295041EC7AF8C00D46CD2 /* NotificationType+Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A195091EC78B4800C3E289 /* NotificationType+Icon.swift */; };
29C295051EC7AF8C00D46CD2 /* NotificationRepoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A195101EC7AC9500C3E289 /* NotificationRepoCell.swift */; };
29C295061EC7AF8C00D46CD2 /* NotificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A1950B1EC7901400C3E289 /* NotificationType.swift */; };
29C2950B1EC7B16800D46CD2 /* Styles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C9FDE01EC667AE00EE3A52 /* Styles.swift */; };
29C2950C1EC7B16C00D46CD2 /* UIColor+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A195011EC66B8B00C3E289 /* UIColor+Hex.swift */; };
29C2950E1EC7B43B00D46CD2 /* ListKitTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C2950D1EC7B43B00D46CD2 /* ListKitTestCase.swift */; };
29C295101EC7B7FF00D46CD2 /* ShowMoreDetailsLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C2950F1EC7B7FF00D46CD2 /* ShowMoreDetailsLabel.swift */; };
29C295111EC7B83200D46CD2 /* ShowMoreDetailsLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C2950F1EC7B7FF00D46CD2 /* ShowMoreDetailsLabel.swift */; };
29C295171EC7BCDA00D46CD2 /* NotificationsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C295151EC7BCCD00D46CD2 /* NotificationsViewController.swift */; };
29C33FDB1F127DBB00EC8D40 /* SplitPlaceholderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C33FDA1F127DBB00EC8D40 /* SplitPlaceholderViewController.swift */; };
@@ -339,7 +246,6 @@
29FF85A51EE1EA7A007B8762 /* ReactionContent+ReactionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29FF85A41EE1EA7A007B8762 /* ReactionContent+ReactionType.swift */; };
4C733A0B57F91680B08D3CEC /* Pods_Freetime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 665D835932698FC1ED93ABE3 /* Pods_Freetime.framework */; };
54AD5E8E1F24D953004A4BD6 /* FeedSelectionProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54AD5E8D1F24D953004A4BD6 /* FeedSelectionProviding.swift */; };
54AD5E8F1F24DA28004A4BD6 /* FeedSelectionProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54AD5E8D1F24D953004A4BD6 /* FeedSelectionProviding.swift */; };
6224B05BDD260B22C7D6684F /* Pods_FreetimeTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB06D68438D845EC6D23788D /* Pods_FreetimeTests.framework */; };
984D9CA91F212ADF00ECEA7F /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 984D9CA81F212ADF00ECEA7F /* Settings.bundle */; };
984D9CAF1F235A8600ECEA7F /* SettingsSourceSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 984D9CAE1F235A8600ECEA7F /* SettingsSourceSectionController.swift */; };
@@ -1694,133 +1600,39 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
2958407E1EEA00E1007723C6 /* IssueCommentModel.swift in Sources */,
295840D21EEA00E1007723C6 /* UIButton+Label.swift in Sources */,
2958409B1EEA00E1007723C6 /* IssueLabelDotCell.swift in Sources */,
2958408F1EEA00E1007723C6 /* IssueCommentTextCell.swift in Sources */,
2958407A1EEA00E1007723C6 /* IssueCommentImageCell.swift in Sources */,
295840961EEA00E1007723C6 /* IssueViewModels.swift in Sources */,
29C295021EC7AF8C00D46CD2 /* NotificationCell.swift in Sources */,
295F52E11EF1C2C9000B53CF /* CommentModelsFromMarkdown.swift in Sources */,
29C295041EC7AF8C00D46CD2 /* NotificationType+Icon.swift in Sources */,
295840771EEA00E1007723C6 /* CollapsibleCell.swift in Sources */,
2958409C1EEA00E1007723C6 /* IssueLabelsModel.swift in Sources */,
295840871EEA00E1007723C6 /* IssueCommentReactionCell.swift in Sources */,
295840A41EEA00E1007723C6 /* IssueStatusSectionController.swift in Sources */,
295840941EEA00E1007723C6 /* IssuesViewController.swift in Sources */,
295840B91EEA00E1007723C6 /* SegmentedControlCell.swift in Sources */,
295840A01EEA00E1007723C6 /* IssueLabelModel.swift in Sources */,
29C167761ECA0DE100439D62 /* NSAttributedStringSizing.swift in Sources */,
295840B01EEA00E1007723C6 /* Subject.swift in Sources */,
297DD5F31F069497006E7E63 /* SettingsReportSectionController.swift in Sources */,
54AD5E8F1F24DA28004A4BD6 /* FeedSelectionProviding.swift in Sources */,
2981A8AC1EFF49EE00E25EF1 /* NSAttributedString+Trim.swift in Sources */,
2958409E1EEA00E1007723C6 /* IssueLabelSummaryCell.swift in Sources */,
29C2950E1EC7B43B00D46CD2 /* ListKitTestCase.swift in Sources */,
29C167721ECA0D7C00439D62 /* UIView+BottomBorder.swift in Sources */,
296CD82A1F0141A6001190B9 /* Samples.swift in Sources */,
2958407B1EEA00E1007723C6 /* IssueCommentImageModel.swift in Sources */,
295840B21EEA00E1007723C6 /* LabelableFields+IssueLabelModel.swift in Sources */,
295840C51EEA00E1007723C6 /* Feed.swift in Sources */,
295840741EEA00E1007723C6 /* IssueStatusEventSectionController.swift in Sources */,
295840C81EEA00E1007723C6 /* GithubUserSession.swift in Sources */,
29C2950B1EC7B16800D46CD2 /* Styles.swift in Sources */,
29C167751ECA0DC300439D62 /* GithubAPIDateFormatter.swift in Sources */,
295F52A91EF1B9E2000B53CF /* MMMarkdownASTTests.swift in Sources */,
295840CD1EEA00E1007723C6 /* UIViewController+LoadingIndicator.swift in Sources */,
2958408E1EEA00E1007723C6 /* IssueCommentSummaryModel.swift in Sources */,
2958409A1EEA00E1007723C6 /* IssueLabelCell.swift in Sources */,
295840991EEA00E1007723C6 /* IssueLabeledSectionController.swift in Sources */,
2958408C1EEA00E1007723C6 /* UIMenuController+Reactions.swift in Sources */,
2981A8B31EFF4A2200E25EF1 /* IssueCommentUnsupportedModel.swift in Sources */,
295840981EEA00E1007723C6 /* IssueLabeledModel.swift in Sources */,
29C295061EC7AF8C00D46CD2 /* NotificationType.swift in Sources */,
295840A31EEA00E1007723C6 /* IssueStatusModel.swift in Sources */,
2958408D1EEA00E1007723C6 /* IssueCommentSummaryCell.swift in Sources */,
295840AC1EEA00E1007723C6 /* Notification.swift in Sources */,
29C295031EC7AF8C00D46CD2 /* NotificationViewModel.swift in Sources */,
297DD5F61F06949E006E7E63 /* RootNavigationManager.swift in Sources */,
29C295051EC7AF8C00D46CD2 /* NotificationRepoCell.swift in Sources */,
295840CE1EEA00E1007723C6 /* ButtonCell.swift in Sources */,
2958408B1EEA00E1007723C6 /* ReactionViewModel.swift in Sources */,
2958408A1EEA00E1007723C6 /* ReactionContent+ReactionType.swift in Sources */,
290EF5671F06A798006A2160 /* Notifications+Filter.swift in Sources */,
295840891EEA00E1007723C6 /* IssueReactionCell.swift in Sources */,
295840AF1EEA00E1007723C6 /* Repository.swift in Sources */,
297DD5FA1F0694A3006E7E63 /* CreateProfileViewController.swift in Sources */,
2958409D1EEA00E1007723C6 /* IssueLabelsSectionController.swift in Sources */,
295840BA1EEA00E1007723C6 /* SegmentedControlModel.swift in Sources */,
295840AE1EEA00E1007723C6 /* Permission.swift in Sources */,
2958407C1EEA00E1007723C6 /* IssueCommentPhoto.swift in Sources */,
297DD5F41F069497006E7E63 /* SettingsViewController.swift in Sources */,
29A195051EC75F3D00C3E289 /* Date+Display.swift in Sources */,
290EF56B1F06A821006A2160 /* Notification+NotificationViewModel.swift in Sources */,
295840791EEA00E1007723C6 /* IssueCommentDetailsViewModel.swift in Sources */,
29A476A61ED23FAE005D0953 /* App.swift in Sources */,
295840CA1EEA00E1007723C6 /* StatusBar.swift in Sources */,
295840971EEA00E1007723C6 /* IssueLabeledCell.swift in Sources */,
29C295101EC7B7FF00D46CD2 /* ShowMoreDetailsLabel.swift in Sources */,
295840731EEA00E1007723C6 /* IssueStatusEventModel.swift in Sources */,
2981A8B41EFF4A2200E25EF1 /* IssueCommentUnsupportedCell.swift in Sources */,
2981A8AB1EFF49EE00E25EF1 /* MMElement+Image.swift in Sources */,
297DD5F51F06949E006E7E63 /* AppDelegate.swift in Sources */,
295840BB1EEA00E1007723C6 /* SegmentedControlSectionController.swift in Sources */,
297DD5F91F0694A3006E7E63 /* UIViewController+SmartDeselection.swift in Sources */,
2980E0931F073E8B000E02C6 /* NotificationSectionController.swift in Sources */,
29A476A51ED23FA2005D0953 /* Authorization.swift in Sources */,
295840C71EEA00E1007723C6 /* GithubSessionManager.swift in Sources */,
295840AD1EEA00E1007723C6 /* Organization.swift in Sources */,
295840751EEA00E1007723C6 /* IssueCommentCodeBlockCell.swift in Sources */,
295840A11EEA00E1007723C6 /* PullRequest+IssueType.swift in Sources */,
295840DC1EEA09B5007723C6 /* IssueCommentQuoteCell.swift in Sources */,
2981A8B11EFF4A1100E25EF1 /* IssueCommentHrCell.swift in Sources */,
295840CC1EEA00E1007723C6 /* UIViewController+Alerts.swift in Sources */,
295840B11EEA00E1007723C6 /* User.swift in Sources */,
295840A21EEA00E1007723C6 /* IssueStatusCell.swift in Sources */,
2958409F1EEA00E1007723C6 /* IssueLabelSummaryModel.swift in Sources */,
295840D31EEA00FB007723C6 /* API.swift in Sources */,
295840B41EEA00E1007723C6 /* NotificationsViewController.swift in Sources */,
295840761EEA00E1007723C6 /* IssueCommentCodeBlockModel.swift in Sources */,
2981A8AD1EFF49EE00E25EF1 /* String+NSRange.swift in Sources */,
295F52A71EF1B9D2000B53CF /* Test.md in Sources */,
29C167711ECA0D7C00439D62 /* Strings.swift in Sources */,
295840911EEA00E1007723C6 /* Issue+IssueType.swift in Sources */,
295840BE1EEA00E1007723C6 /* SettingsSignoutSectionController.swift in Sources */,
295840781EEA00E1007723C6 /* IssueCommentDetailCell.swift in Sources */,
2958407F1EEA00E1007723C6 /* IssueCommentSectionController.swift in Sources */,
29A476AA1ED24032005D0953 /* ListTestKit.swift in Sources */,
2981A8AE1EFF49EE00E25EF1 /* UIFont+MutableTraits.swift in Sources */,
2981A8AF1EFF4A0400E25EF1 /* IssueCommentHtmlCell.swift in Sources */,
297DD5F71F0694A3006E7E63 /* RootViewControllers.swift in Sources */,
295840D01EEA00E1007723C6 /* ShowMoreDetailsLabel+Date.swift in Sources */,
2981A8A91EFF49EE00E25EF1 /* MMElement+Attributes.swift in Sources */,
295840951EEA00E1007723C6 /* IssueType.swift in Sources */,
297DD5F81F0694A3006E7E63 /* SplitViewControllerDelegate.swift in Sources */,
29C2950C1EC7B16C00D46CD2 /* UIColor+Hex.swift in Sources */,
2981A8A81EFF49DE00E25EF1 /* AttributedStringView.swift in Sources */,
295840A51EEA00E1007723C6 /* IssueTitleCell.swift in Sources */,
29A476A11ED23F83005D0953 /* DateDetailsFormatter.swift in Sources */,
297DD5F01F06948D006E7E63 /* NotificationClient.swift in Sources */,
295840D11EEA00E1007723C6 /* UIColor+Overlay.swift in Sources */,
295840881EEA00E1007723C6 /* IssueCommentReactionViewModel.swift in Sources */,
2981A8A51EFEBEE300E25EF1 /* GithubEmoji.swift in Sources */,
2981A8A71EFEBEF900E25EF1 /* EmojiTests.swift in Sources */,
295840DB1EEA09B5007723C6 /* IssueCommentQuoteModel.swift in Sources */,
297DD5F11F06948D006E7E63 /* NotificationNavigation.swift in Sources */,
297AE84D1EC0D58A00B44A1F /* DateDisplayTests.swift in Sources */,
295840CF1EEA00E1007723C6 /* ResponderButton.swift in Sources */,
295840A61EEA00E1007723C6 /* IssueTitleSectionController.swift in Sources */,
29C167701ECA0D7C00439D62 /* EmptyView.swift in Sources */,
2981A8B21EFF4A1500E25EF1 /* IssueCommentHtmlModel.swift in Sources */,
2981A8B01EFF4A1100E25EF1 /* IssueCommentHrModel.swift in Sources */,
2958407D1EEA00E1007723C6 /* IssueCollapsedBodies.swift in Sources */,
297DD5E71F06945C006E7E63 /* IssueStatus.swift in Sources */,
29A476B21ED24D99005D0953 /* IssueTests.swift in Sources */,
295840B81EEA00E1007723C6 /* Secrets.swift in Sources */,
2981A8AA1EFF49EE00E25EF1 /* MMElement+CodeBlock.swift in Sources */,
295840721EEA00E1007723C6 /* IssueStatusEventCell.swift in Sources */,
295840C61EEA00E1007723C6 /* GithubClient.swift in Sources */,
295840C31EEA00E1007723C6 /* Alamofire+GithubAPI.swift in Sources */,
293A45821F296CA000DD1006 /* IssueCommentQuoteModel.swift in Sources */,
293A45751F296B7E00DD1006 /* DateDisplayTests.swift in Sources */,
293A45971F298D4B00DD1006 /* IssueCommentTableModel.swift in Sources */,
293A45761F296B7E00DD1006 /* IssueTests.swift in Sources */,
293A457F1F296BE200DD1006 /* Date+Display.swift in Sources */,
293A45911F296CF300DD1006 /* String+NSRange.swift in Sources */,
293A45921F296CF300DD1006 /* UIFont+MutableTraits.swift in Sources */,
293A45831F296CAF00DD1006 /* Styles.swift in Sources */,
293A45771F296B7E00DD1006 /* ListKitTestCase.swift in Sources */,
293A457E1F296BD500DD1006 /* API.swift in Sources */,
293A459C1F298E9700DD1006 /* IssueCommentTextCell.swift in Sources */,
293A45781F296B7E00DD1006 /* ListTestKit.swift in Sources */,
293A458D1F296CF300DD1006 /* MMElement+CodeBlock.swift in Sources */,
293A45851F296CE200DD1006 /* IssueCommentCodeBlockModel.swift in Sources */,
293A45981F298D5700DD1006 /* IssueCommentTableCollectionCell.swift in Sources */,
293A459F1F298EED00DD1006 /* IssueCommentHtmlModel.swift in Sources */,
293A45801F296BEA00DD1006 /* GithubEmoji.swift in Sources */,
293A458C1F296CF300DD1006 /* MMElement+Attributes.swift in Sources */,
293A45951F296D8E00DD1006 /* IssueCommentImageModel.swift in Sources */,
293A459B1F298E7D00DD1006 /* IssueCommentSummaryModel.swift in Sources */,
293A458B1F296CF300DD1006 /* CommentModelsFromMarkdown.swift in Sources */,
293A457D1F296BD200DD1006 /* NSAttributedStringSizing.swift in Sources */,
293A45791F296B7E00DD1006 /* MMMarkdownASTTests.swift in Sources */,
293A45941F296D5B00DD1006 /* CollapsibleCell.swift in Sources */,
293A45961F298C9500DD1006 /* UIColor+Hex.swift in Sources */,
293A459D1F298EDB00DD1006 /* IssueCommentQuoteCell.swift in Sources */,
293A458E1F296CF300DD1006 /* MMElement+Image.swift in Sources */,
293A458F1F296CF300DD1006 /* MMElement+Table.swift in Sources */,
293A459E1F298EE200DD1006 /* IssueCommentHrModel.swift in Sources */,
293A457A1F296B7E00DD1006 /* EmojiTests.swift in Sources */,
293A45901F296CF300DD1006 /* NSAttributedString+Trim.swift in Sources */,
293A45931F296D4E00DD1006 /* IssueCommentCodeBlockCell.swift in Sources */,
293A45991F298D8400DD1006 /* AttributedStringView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@@ -31,7 +31,7 @@ class IssueTests: XCTestCase {
"![alt text](https://apple.com)",
"then some more text",
].joined(separator: "\r\n")
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 3)
XCTAssertEqual((models[0] as! NSAttributedStringSizing).attributedText.string, "this is the first line")
XCTAssertEqual((models[1] as! IssueCommentImageModel).url.absoluteString, "https://apple.com")
@@ -40,7 +40,7 @@ class IssueTests: XCTestCase {
func test_whenStringHasNewlines() {
let body = "foo\r\nbar"
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 1)
XCTAssertEqual((models[0] as! NSAttributedStringSizing).attributedText.string, "foo\nbar")
}
@@ -51,7 +51,7 @@ class IssueTests: XCTestCase {
"this is the first line",
"then some more text",
].joined(separator: "\r\n")
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 2)
XCTAssertEqual((models[0] as! IssueCommentImageModel).url.absoluteString, "https://apple.com")
XCTAssertEqual((models[1] as! NSAttributedStringSizing).attributedText.string, "this is the first line\nthen some more text")
@@ -63,7 +63,7 @@ class IssueTests: XCTestCase {
"then some more text",
"![alt text](https://apple.com)",
].joined(separator: "\r\n")
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 2)
XCTAssertEqual((models[0] as! NSAttributedStringSizing).attributedText.string, "this is the first line\nthen some more text")
XCTAssertEqual((models[1] as! IssueCommentImageModel).url.absoluteString, "https://apple.com")
@@ -73,7 +73,7 @@ class IssueTests: XCTestCase {
let body = [
"![alt text](https://apple.com)",
].joined(separator: "\r\n")
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 1)
XCTAssertEqual((models[0] as! IssueCommentImageModel).url.absoluteString, "https://apple.com")
}
@@ -86,7 +86,7 @@ class IssueTests: XCTestCase {
"![alt text](https://google.com)",
"foo bar baz",
].joined(separator: "\r\n")
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 5)
XCTAssertEqual((models[0] as! NSAttributedStringSizing).attributedText.string, "this is the first line")
XCTAssertEqual((models[1] as! IssueCommentImageModel).url.absoluteString, "https://apple.com")
@@ -103,7 +103,7 @@ class IssueTests: XCTestCase {
"```",
"this is the end"
].joined(separator: "\r\n")
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 3)
XCTAssertEqual((models[0] as! NSAttributedStringSizing).attributedText.string, "this is some text")
XCTAssertEqual((models[1] as! IssueCommentCodeBlockModel).code.attributedText.string, "let a = 5")
@@ -119,7 +119,7 @@ class IssueTests: XCTestCase {
"```",
"this is the end"
].joined(separator: "\r\n")
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 3)
XCTAssertEqual((models[0] as! NSAttributedStringSizing).attributedText.string, "this is some text")
XCTAssertEqual((models[1] as! IssueCommentCodeBlockModel).code.attributedText.string, "let a = 5")
@@ -135,7 +135,7 @@ class IssueTests: XCTestCase {
"</details>",
"this is the end"
].joined(separator: "\r\n")
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 3)
XCTAssertEqual((models[0] as! NSAttributedStringSizing).attributedText.string, "this is some text")
XCTAssertEqual((models[1] as! IssueCommentSummaryModel).summary, "sum")
@@ -151,7 +151,7 @@ class IssueTests: XCTestCase {
"</details>",
"this is the end"
].joined(separator: "\r\n")
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 3)
XCTAssertEqual((models[0] as! NSAttributedStringSizing).attributedText.string, "this is some text")
XCTAssertEqual((models[1] as! IssueCommentSummaryModel).summary, "sum")
@@ -171,7 +171,7 @@ class IssueTests: XCTestCase {
"</details>",
"this is the end"
].joined(separator: "\r\n")
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 3)
XCTAssertEqual((models[0] as! NSAttributedStringSizing).attributedText.string, "this is some text")
XCTAssertEqual((models[1] as! IssueCommentSummaryModel).summary, "sum")
@@ -188,7 +188,7 @@ class IssueTests: XCTestCase {
"![alt text](https://google.com)",
"foo bar baz",
].joined(separator: "\r\n")
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 5)
XCTAssertEqual((models[0] as! NSAttributedStringSizing).attributedText.string, "this is the first line")
XCTAssertEqual((models[1] as! IssueCommentCodeBlockModel).language, "lang")
@@ -212,7 +212,7 @@ class IssueTests: XCTestCase {
"![alt text](https://google.com)",
"foo bar baz",
].joined(separator: "\r\n")
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 5)
XCTAssertEqual((models[0] as! NSAttributedStringSizing).attributedText.string, "this is the first line")
XCTAssertEqual((models[1] as! IssueCommentSummaryModel).summary, "sum")
@@ -222,7 +222,7 @@ class IssueTests: XCTestCase {
func test_whenCodePartOfParagraph() {
let body = "text with ````` inline with ````` more"
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 1)
}
@@ -235,7 +235,7 @@ class IssueTests: XCTestCase {
"> quote three",
"line three"
].joined(separator: "\r\n")
let models = commentModels(markdown: body, width: 300)
let models = CreateCommentModels(markdown: body, width: 300)
XCTAssertEqual(models.count, 5)
XCTAssertEqual((models[0] as! NSAttributedStringSizing).attributedText.string, "line one")
XCTAssertEqual((models[1] as! IssueCommentQuoteModel).quote.attributedText.string, "quote one")

View File

@@ -27,12 +27,12 @@ final class MMMarkdownASTTests: XCTestCase {
}
func test_creatingTestMarkdownWorks() {
let result = commentModels(markdown: testMarkdown, width: 300)
let result = CreateCommentModels(markdown: testMarkdown, width: 300)
XCTAssertTrue(result.count > 0)
}
func test_plainText() {
let result = commentModels(markdown: "foo", width: 300)
let result = CreateCommentModels(markdown: "foo", width: 300)
XCTAssertEqual(result.count, 1)
let text = result.first as! NSAttributedStringSizing
@@ -40,7 +40,7 @@ final class MMMarkdownASTTests: XCTestCase {
}
func test_paragraphWithBold() {
let result = commentModels(markdown: "foo **bar**", width: 300)
let result = CreateCommentModels(markdown: "foo **bar**", width: 300)
XCTAssertEqual(result.count, 1)
let text = result.first as! NSAttributedStringSizing
@@ -48,7 +48,7 @@ final class MMMarkdownASTTests: XCTestCase {
}
func test_paragraphWithItalics() {
let result = commentModels(markdown: "foo _bar_", width: 300)
let result = CreateCommentModels(markdown: "foo _bar_", width: 300)
XCTAssertEqual(result.count, 1)
let text = result.first as! NSAttributedStringSizing
@@ -62,7 +62,7 @@ final class MMMarkdownASTTests: XCTestCase {
" - 2.1",
"- 1.3",
].joined(separator: "\n")
let result = commentModels(markdown: md, width: 300)
let result = CreateCommentModels(markdown: md, width: 300)
let text = result.first as! NSAttributedStringSizing
XCTAssertEqual(text.attributedText.string, "\u{2022} 1.1 italic\n\u{2022} 1.2 bold\n\u{2022} 2.1\n\u{2022} 1.3")

View File

@@ -32,7 +32,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>1053</string>
<string>1083</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSApplicationQueriesSchemes</key>