From 4c164300337a35d002188a83a878346819b203c0 Mon Sep 17 00:00:00 2001 From: Guille Gonzalez Date: Sat, 26 Feb 2022 18:41:15 +0100 Subject: [PATCH] Use the environment's line spacing (#95) * Set the environment's line spacing value to the attributed string paragraph style * Refactor renderer environment --- Sources/MarkdownUI/Markdown.swift | 90 ++++++------------ ...AttributedStringRenderer+Environment.swift | 58 +++++++++++ .../Rendering/AttributedStringRenderer.swift | 65 ++++++------- .../Document+NSAttributedString.swift | 30 +----- Tests/MarkdownUITests/MarkdownTests.swift | 14 +++ .../MarkdownTests/testLinespacing.iOS.png | Bin 0 -> 36794 bytes .../MarkdownTests/testLinespacing.tvOS.png | Bin 0 -> 49779 bytes 7 files changed, 138 insertions(+), 119 deletions(-) create mode 100644 Sources/MarkdownUI/Rendering/AttributedStringRenderer+Environment.swift create mode 100644 Tests/MarkdownUITests/__Snapshots__/MarkdownTests/testLinespacing.iOS.png create mode 100644 Tests/MarkdownUITests/__Snapshots__/MarkdownTests/testLinespacing.tvOS.png diff --git a/Sources/MarkdownUI/Markdown.swift b/Sources/MarkdownUI/Markdown.swift index d1f73555..c8494c4a 100644 --- a/Sources/MarkdownUI/Markdown.swift +++ b/Sources/MarkdownUI/Markdown.swift @@ -119,12 +119,13 @@ public struct Markdown: View { private struct ViewState { var attributedString = NSAttributedString() - var environmentHash: Int? + var hashValue: Int? } @Environment(\.layoutDirection) private var layoutDirection: LayoutDirection @Environment(\.multilineTextAlignment) private var textAlignment: TextAlignment @Environment(\.sizeCategory) private var sizeCategory: ContentSizeCategory + @Environment(\.lineSpacing) private var lineSpacing: CGFloat @Environment(\.markdownStyle) private var style: MarkdownStyle @Environment(\.openMarkdownLink) private var openMarkdownLink @State private var viewState = ViewState() @@ -194,35 +195,32 @@ public struct Markdown: View { } private var viewStatePublisher: AnyPublisher { - struct Environment: Hashable { - var storage: Storage - var baseURL: URL? - var layoutDirection: LayoutDirection - var textAlignment: TextAlignment - var sizeCategory: ContentSizeCategory - var style: MarkdownStyle + struct Input: Hashable { + let storage: Storage + let environment: AttributedStringRenderer.Environment } return Just( // This value helps determine if we need to render the markdown again - Environment( + Input( storage: self.storage, - baseURL: self.baseURL, - layoutDirection: self.layoutDirection, - textAlignment: self.textAlignment, - sizeCategory: self.sizeCategory, - style: self.style + environment: .init( + baseURL: self.baseURL, + layoutDirection: self.layoutDirection, + alignment: self.textAlignment, + lineSpacing: self.lineSpacing, + sizeCategory: self.sizeCategory, + style: self.style + ) ).hashValue ) - .flatMap { environmentHash -> AnyPublisher in - if self.viewState.environmentHash == environmentHash, - !viewState.attributedString.hasMarkdownImages - { + .flatMap { hashValue -> AnyPublisher in + if self.viewState.hashValue == hashValue, !viewState.attributedString.hasMarkdownImages { return Empty().eraseToAnyPublisher() - } else if self.viewState.environmentHash == environmentHash { - return self.loadMarkdownImages(environmentHash: environmentHash) + } else if self.viewState.hashValue == hashValue { + return self.loadMarkdownImages(hashValue) } else { - return self.renderAttributedString(environmentHash: environmentHash) + return self.renderAttributedString(hashValue) } } .eraseToAnyPublisher() @@ -235,29 +233,29 @@ public struct Markdown: View { } } - private func loadMarkdownImages(environmentHash: Int) -> AnyPublisher { + private func loadMarkdownImages(_ hashValue: Int) -> AnyPublisher { NSAttributedString.loadingMarkdownImages( from: self.viewState.attributedString, using: self.imageHandlers ) - .map { ViewState(attributedString: $0, environmentHash: environmentHash) } + .map { ViewState(attributedString: $0, hashValue: hashValue) } .receive(on: UIScheduler.shared) .eraseToAnyPublisher() } - private func renderAttributedString(environmentHash: Int) -> AnyPublisher { + private func renderAttributedString(_ hashValue: Int) -> AnyPublisher { self.storage.document.renderAttributedString( - baseURL: self.baseURL, - baseWritingDirection: .init(self.layoutDirection), - alignment: .init( + environment: .init( + baseURL: self.baseURL, layoutDirection: self.layoutDirection, - textAlignment: self.textAlignment + alignment: self.textAlignment, + lineSpacing: self.lineSpacing, + sizeCategory: self.sizeCategory, + style: self.style ), - sizeCategory: self.sizeCategory, - style: self.style, imageHandlers: self.imageHandlers ) - .map { ViewState(attributedString: $0, environmentHash: environmentHash) } + .map { ViewState(attributedString: $0, hashValue: hashValue) } .receive(on: UIScheduler.shared) .eraseToAnyPublisher() } @@ -412,33 +410,3 @@ private struct OpenMarkdownLinkAction { private struct OpenMarkdownLinkKey: EnvironmentKey { static let defaultValue: OpenMarkdownLinkAction? = nil } - -extension NSWritingDirection { - fileprivate init(_ layoutDirection: LayoutDirection) { - switch layoutDirection { - case .leftToRight: - self = .leftToRight - case .rightToLeft: - self = .rightToLeft - @unknown default: - self = .natural - } - } -} - -extension NSTextAlignment { - fileprivate init(layoutDirection: LayoutDirection, textAlignment: TextAlignment) { - switch (layoutDirection, textAlignment) { - case (_, .leading): - self = .natural - case (_, .center): - self = .center - case (.leftToRight, .trailing): - self = .right - case (.rightToLeft, .trailing): - self = .left - default: - self = .natural - } - } -} diff --git a/Sources/MarkdownUI/Rendering/AttributedStringRenderer+Environment.swift b/Sources/MarkdownUI/Rendering/AttributedStringRenderer+Environment.swift new file mode 100644 index 00000000..88c42480 --- /dev/null +++ b/Sources/MarkdownUI/Rendering/AttributedStringRenderer+Environment.swift @@ -0,0 +1,58 @@ +import SwiftUI + +extension AttributedStringRenderer { + struct Environment: Hashable { + let baseURL: URL? + let baseWritingDirection: NSWritingDirection + let alignment: NSTextAlignment + let lineSpacing: CGFloat + let sizeCategory: ContentSizeCategory + let style: MarkdownStyle + + init( + baseURL: URL?, + layoutDirection: LayoutDirection, + alignment: TextAlignment, + lineSpacing: CGFloat, + sizeCategory: ContentSizeCategory, + style: MarkdownStyle + ) { + self.baseURL = baseURL + self.baseWritingDirection = .init(layoutDirection) + self.alignment = .init(layoutDirection, alignment) + self.lineSpacing = lineSpacing + self.sizeCategory = sizeCategory + self.style = style + } + } +} + +extension NSWritingDirection { + fileprivate init(_ layoutDirection: LayoutDirection) { + switch layoutDirection { + case .leftToRight: + self = .leftToRight + case .rightToLeft: + self = .rightToLeft + @unknown default: + self = .natural + } + } +} + +extension NSTextAlignment { + fileprivate init(_ layoutDirection: LayoutDirection, _ textAlignment: TextAlignment) { + switch (layoutDirection, textAlignment) { + case (_, .leading): + self = .natural + case (_, .center): + self = .center + case (.leftToRight, .trailing): + self = .right + case (.rightToLeft, .trailing): + self = .left + default: + self = .natural + } + } +} diff --git a/Sources/MarkdownUI/Rendering/AttributedStringRenderer.swift b/Sources/MarkdownUI/Rendering/AttributedStringRenderer.swift index 3d20da3d..f1be4172 100644 --- a/Sources/MarkdownUI/Rendering/AttributedStringRenderer.swift +++ b/Sources/MarkdownUI/Rendering/AttributedStringRenderer.swift @@ -36,19 +36,15 @@ struct AttributedStringRenderer { case decimal(Int) } - let baseURL: URL? - let baseWritingDirection: NSWritingDirection - let alignment: NSTextAlignment - let sizeCategory: ContentSizeCategory - let style: MarkdownStyle + let environment: Environment func renderDocument(_ document: Document) -> NSAttributedString { return renderBlocks( document.blocks, state: .init( - font: style.font, - foregroundColor: style.foregroundColor, - paragraphSpacing: style.measurements.paragraphSpacing + font: environment.style.font, + foregroundColor: environment.style.foregroundColor, + paragraphSpacing: environment.style.measurements.paragraphSpacing ) ) } @@ -101,8 +97,8 @@ extension AttributedStringRenderer { var state = state state.font = state.font.italic() - state.headIndent += style.measurements.headIndentStep - state.tailIndent += style.measurements.tailIndentStep + state.headIndent += environment.style.measurements.headIndentStep + state.tailIndent += environment.style.measurements.tailIndentStep state.tabStops.append( .init(textAlignment: .natural, location: state.headIndent) ) @@ -129,13 +125,14 @@ extension AttributedStringRenderer { let result = NSMutableAttributedString() var itemState = state - itemState.paragraphSpacing = bulletList.tight ? 0 : style.measurements.paragraphSpacing - itemState.headIndent += style.measurements.headIndentStep + itemState.paragraphSpacing = + bulletList.tight ? 0 : environment.style.measurements.paragraphSpacing + itemState.headIndent += environment.style.measurements.headIndentStep itemState.tabStops.append( contentsOf: [ .init( - textAlignment: .trailing(baseWritingDirection), - location: itemState.headIndent - style.measurements.listMarkerSpacing + textAlignment: .trailing(environment.baseWritingDirection), + location: itemState.headIndent - environment.style.measurements.listMarkerSpacing ), .init(textAlignment: .natural, location: itemState.headIndent), ] @@ -172,21 +169,24 @@ extension AttributedStringRenderer { // as the head indent step if higher than the style's head indent step. let highestNumber = orderedList.start + orderedList.items.count - 1 let headIndentStep = max( - style.measurements.headIndentStep, + environment.style.measurements.headIndentStep, NSAttributedString( string: "\(highestNumber).", - attributes: [.font: state.font.monospacedDigit().resolve(sizeCategory: sizeCategory)] - ).em() + style.measurements.listMarkerSpacing + attributes: [ + .font: state.font.monospacedDigit().resolve(sizeCategory: environment.sizeCategory) + ] + ).em() + environment.style.measurements.listMarkerSpacing ) var itemState = state - itemState.paragraphSpacing = orderedList.tight ? 0 : style.measurements.paragraphSpacing + itemState.paragraphSpacing = + orderedList.tight ? 0 : environment.style.measurements.paragraphSpacing itemState.headIndent += headIndentStep itemState.tabStops.append( contentsOf: [ .init( - textAlignment: .trailing(baseWritingDirection), - location: itemState.headIndent - style.measurements.listMarkerSpacing + textAlignment: .trailing(environment.baseWritingDirection), + location: itemState.headIndent - environment.style.measurements.listMarkerSpacing ), .init(textAlignment: .natural, location: itemState.headIndent), ] @@ -258,8 +258,8 @@ extension AttributedStringRenderer { state: State ) -> NSAttributedString { var state = state - state.font = state.font.scale(style.measurements.codeFontScale).monospaced() - state.headIndent += style.measurements.headIndentStep + state.font = state.font.scale(environment.style.measurements.codeFontScale).monospaced() + state.headIndent += environment.style.measurements.headIndentStep state.tabStops.append( .init(textAlignment: .natural, location: state.headIndent) ) @@ -313,14 +313,14 @@ extension AttributedStringRenderer { var inlineState = state inlineState.font = inlineState.font.bold().scale( - style.measurements.headingScales[heading.level - 1] + environment.style.measurements.headingScales[heading.level - 1] ) result.append(renderInlines(heading.text, state: inlineState)) // The paragraph spacing is relative to the parent font var paragraphState = state - paragraphState.paragraphSpacing = style.measurements.headingSpacing + paragraphState.paragraphSpacing = environment.style.measurements.headingSpacing result.addAttribute( .paragraphStyle, @@ -342,7 +342,7 @@ extension AttributedStringRenderer { .init( string: .nbsp, attributes: [ - .font: state.font.resolve(sizeCategory: sizeCategory), + .font: state.font.resolve(sizeCategory: environment.sizeCategory), .strikethroughStyle: NSUnderlineStyle.single.rawValue, .strikethroughColor: PlatformColor.separator, ] @@ -425,7 +425,7 @@ extension AttributedStringRenderer { NSAttributedString( string: text, attributes: [ - .font: state.font.resolve(sizeCategory: sizeCategory), + .font: state.font.resolve(sizeCategory: environment.sizeCategory), .foregroundColor: PlatformColor(state.foregroundColor), ] ) @@ -441,7 +441,7 @@ extension AttributedStringRenderer { private func renderInlineCode(_ inlineCode: InlineCode, state: State) -> NSAttributedString { var state = state - state.font = state.font.scale(style.measurements.codeFontScale).monospaced() + state.font = state.font.scale(environment.style.measurements.codeFontScale).monospaced() return renderText(inlineCode.code, state: state) } @@ -466,7 +466,7 @@ extension AttributedStringRenderer { let absoluteURL = link.url .map(\.relativeString) - .flatMap { URL(string: $0, relativeTo: baseURL) } + .flatMap { URL(string: $0, relativeTo: environment.baseURL) } .map(\.absoluteURL) if let url = absoluteURL { result.addAttribute(.link, value: url, range: NSRange(0.. NSAttributedString { image.url .map(\.relativeString) - .flatMap { URL(string: $0, relativeTo: baseURL) } + .flatMap { URL(string: $0, relativeTo: environment.baseURL) } .map(\.absoluteURL) .map { NSAttributedString(markdownImageURL: $0) @@ -491,11 +491,12 @@ extension AttributedStringRenderer { } private func paragraphStyle(state: State) -> NSParagraphStyle { - let pointSize = state.font.resolve(sizeCategory: sizeCategory).pointSize + let pointSize = state.font.resolve(sizeCategory: environment.sizeCategory).pointSize let result = NSMutableParagraphStyle() result.setParagraphStyle(.default) - result.baseWritingDirection = baseWritingDirection - result.alignment = alignment + result.baseWritingDirection = environment.baseWritingDirection + result.alignment = environment.alignment + result.lineSpacing = environment.lineSpacing result.paragraphSpacing = round(pointSize * state.paragraphSpacing) result.headIndent = round(pointSize * state.headIndent) result.tailIndent = round(pointSize * state.tailIndent) diff --git a/Sources/MarkdownUI/Rendering/Document+NSAttributedString.swift b/Sources/MarkdownUI/Rendering/Document+NSAttributedString.swift index ad867199..87defe68 100644 --- a/Sources/MarkdownUI/Rendering/Document+NSAttributedString.swift +++ b/Sources/MarkdownUI/Rendering/Document+NSAttributedString.swift @@ -4,39 +4,17 @@ import SwiftUI extension Document { func renderAttributedString( - baseURL: URL?, - baseWritingDirection: NSWritingDirection, - alignment: NSTextAlignment, - sizeCategory: ContentSizeCategory, - style: MarkdownStyle + environment: AttributedStringRenderer.Environment ) -> NSAttributedString { - AttributedStringRenderer( - baseURL: baseURL, - baseWritingDirection: baseWritingDirection, - alignment: alignment, - sizeCategory: sizeCategory, - style: style - ).renderDocument(self) + AttributedStringRenderer(environment: environment).renderDocument(self) } func renderAttributedString( - baseURL: URL?, - baseWritingDirection: NSWritingDirection, - alignment: NSTextAlignment, - sizeCategory: ContentSizeCategory, - style: MarkdownStyle, + environment: AttributedStringRenderer.Environment, imageHandlers: [String: MarkdownImageHandler] ) -> AnyPublisher { Deferred { - Just( - self.renderAttributedString( - baseURL: baseURL, - baseWritingDirection: baseWritingDirection, - alignment: alignment, - sizeCategory: sizeCategory, - style: style - ) - ) + Just(self.renderAttributedString(environment: environment)) } .flatMap { attributedString -> AnyPublisher in guard attributedString.hasMarkdownImages else { diff --git a/Tests/MarkdownUITests/MarkdownTests.swift b/Tests/MarkdownUITests/MarkdownTests.swift index 5d5b2e94..daab593c 100644 --- a/Tests/MarkdownUITests/MarkdownTests.swift +++ b/Tests/MarkdownUITests/MarkdownTests.swift @@ -450,6 +450,20 @@ assertSnapshot(matching: view, as: .image(layout: layout), named: platformName) } + func testLinespacing() { + let view = Markdown( + #""" + The sky above the port was the color of television,\ + tuned to a dead channel. + """# + ) + .lineSpacing(25) + .background(Color.orange) + .padding() + + assertSnapshot(matching: view, as: .image(layout: layout), named: platformName) + } + #if os(iOS) func testSizeCategory() { let view = VStack { diff --git a/Tests/MarkdownUITests/__Snapshots__/MarkdownTests/testLinespacing.iOS.png b/Tests/MarkdownUITests/__Snapshots__/MarkdownTests/testLinespacing.iOS.png new file mode 100644 index 0000000000000000000000000000000000000000..4a2cce3001c2b7482b5b1ab0e567739a96099afc GIT binary patch literal 36794 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 KtN8WgAO8mjn_$QQ literal 0 HcmV?d00001 diff --git a/Tests/MarkdownUITests/__Snapshots__/MarkdownTests/testLinespacing.tvOS.png b/Tests/MarkdownUITests/__Snapshots__/MarkdownTests/testLinespacing.tvOS.png new file mode 100644 index 0000000000000000000000000000000000000000..4d5892d7b305ae4ad246d6550e8baed3e8711853 GIT binary patch literal 49779 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%0Do5BVfAyg!|E#j@iP8!G3U8bE^7qF{6h_T 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 literal 0 HcmV?d00001