Extract HTML fixtures out of the FormattedBoxyText previews.
This commit is contained in:
@@ -281,6 +281,7 @@
|
||||
30E5628F74AD3C27A061BF25 /* QRCodeLoginScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BC1B7CB061C9865B2B91B56 /* QRCodeLoginScreenViewModel.swift */; };
|
||||
311868F5E65BA61AFA6CCC2C /* CompoundHook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B89D6C760E8CAE29CA28FB1 /* CompoundHook.swift */; };
|
||||
3118D9ABFD4BE5A3492FF88A /* ElementCallConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC437C491EA6996513B1CEAB /* ElementCallConfiguration.swift */; };
|
||||
31CCF3159E5CE1C05AE5781B /* HTMLFixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27A5FBB74981BF8EFFDAE90D /* HTMLFixtures.swift */; };
|
||||
31DE6B7FD15E1C6E43885717 /* RoomRole.swift in Sources */ = {isa = PBXBuildFile; fileRef = 578AF9CE60816069536C0953 /* RoomRole.swift */; };
|
||||
32B7891D937377A59606EDFC /* UserFlowTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21DD8599815136EFF5B73F38 /* UserFlowTests.swift */; };
|
||||
32F47002A331817F0E6BD7EB /* RoomMembershipDetailsProxyProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1434D5169F0EE319E226DA7F /* RoomMembershipDetailsProxyProtocol.swift */; };
|
||||
@@ -1327,6 +1328,7 @@
|
||||
F382E2FE3AC3719BC1F22D9C /* MapURLs.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB08D1F7C27A8C24EF81073C /* MapURLs.swift */; };
|
||||
F38D32C1B0232AAFE6A0822C /* ExtensionLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41A8571A8A071FB41778C016 /* ExtensionLogger.swift */; };
|
||||
F396470968764E2C3EDA92DA /* SpaceListScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FB180B67B452302260AF44B /* SpaceListScreenViewModel.swift */; };
|
||||
F3C9CAD26FD4D7D6EBACF501 /* HTMLFixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27A5FBB74981BF8EFFDAE90D /* HTMLFixtures.swift */; };
|
||||
F3E2D3F7ACDED65A4E5CD8DE /* RoomMembersListScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF79FB25E2D4BD6F50CE7C9 /* RoomMembersListScreenViewModel.swift */; };
|
||||
F3ECA377FF77E81A4F1FA062 /* TimelineItemSendInfoLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 753B4C6C0EDDCBF0708DC384 /* TimelineItemSendInfoLabel.swift */; };
|
||||
F3F38062C6CA21CF403C5C90 /* AudioConverterProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2757B1BE23DF8AA239937243 /* AudioConverterProtocol.swift */; };
|
||||
@@ -1706,6 +1708,7 @@
|
||||
276833816F5DEB1CE3B8BE1E /* ReportRoomScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportRoomScreen.swift; sourceTree = "<group>"; };
|
||||
277C20CDD5B64510401B6D0D /* ServerConfigurationScreenViewStateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerConfigurationScreenViewStateTests.swift; sourceTree = "<group>"; };
|
||||
27A1AD6389A4659AF0CEAE62 /* NotificationServiceExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationServiceExtension.swift; sourceTree = "<group>"; };
|
||||
27A5FBB74981BF8EFFDAE90D /* HTMLFixtures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTMLFixtures.swift; sourceTree = "<group>"; };
|
||||
27A9E3FBE8A66B5A17AD7F74 /* AppRoutes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRoutes.swift; sourceTree = "<group>"; };
|
||||
27D0EA07BD545CC9F234DB8D /* UserDetailsEditScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDetailsEditScreenModels.swift; sourceTree = "<group>"; };
|
||||
27DF257F5D968E5DD719583C /* BugReportTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BugReportTests.swift; sourceTree = "<group>"; };
|
||||
@@ -5056,6 +5059,7 @@
|
||||
F254AD274D6973B840FEAF0B /* AttributedStringBuilderV2.swift */,
|
||||
1E508AB0EDEE017FF4F6F8D1 /* DTHTMLElement+AttributedStringBuilder.swift */,
|
||||
C024C151639C4E1B91FCC68B /* ElementXAttributeScope.swift */,
|
||||
27A5FBB74981BF8EFFDAE90D /* HTMLFixtures.swift */,
|
||||
AB07F03461023BC39C730922 /* PhishingDetector.swift */,
|
||||
A436057DBEA1A23CA8CB1FD7 /* UIFont+AttributedStringBuilder.h */,
|
||||
E8CA187FE656EE5A3F6C7DE5 /* UIFont+AttributedStringBuilder.m */,
|
||||
@@ -7162,6 +7166,7 @@
|
||||
89198AE2649DD77673D5793B /* ExtensionLogger.swift in Sources */,
|
||||
A33784831AD880A670CAA9F9 /* FileManager.swift in Sources */,
|
||||
0DFCEAB8C82B151718F71D49 /* FrequentlyUsedEmoji.swift in Sources */,
|
||||
31CCF3159E5CE1C05AE5781B /* HTMLFixtures.swift in Sources */,
|
||||
59F940FCBE6BC343AECEF75E /* ImageCache.swift in Sources */,
|
||||
EBE13FAB4E29738AC41BD3E5 /* InfoPlistReader.swift in Sources */,
|
||||
8691186F9B99BCDDB7CACDD8 /* KeychainController.swift in Sources */,
|
||||
@@ -7717,6 +7722,7 @@
|
||||
D34E328E9E65904358248FDD /* GlobalSearchScreenModels.swift in Sources */,
|
||||
55D18AA4F4A2257642EBDB94 /* GlobalSearchScreenViewModel.swift in Sources */,
|
||||
E32A18802EB37EEE3EF7B965 /* GlobalSearchScreenViewModelProtocol.swift in Sources */,
|
||||
F3C9CAD26FD4D7D6EBACF501 /* HTMLFixtures.swift in Sources */,
|
||||
E8C4D9F93F0DCED211D5F187 /* HTMLParserStyle.swift in Sources */,
|
||||
0C1E537A49ABB386F7554D4A /* HighlightedTimelineItemModifier.swift in Sources */,
|
||||
964B9D2EC38C488C360CE0C9 /* HomeScreen.swift in Sources */,
|
||||
|
||||
106
ElementX/Sources/Other/HTMLParsing/HTMLFixtures.swift
Normal file
106
ElementX/Sources/Other/HTMLParsing/HTMLFixtures.swift
Normal file
@@ -0,0 +1,106 @@
|
||||
//
|
||||
// Copyright 2025 New Vector Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
// Please see LICENSE files in the repository root for full details.
|
||||
//
|
||||
|
||||
enum HTMLFixtures: String, CaseIterable {
|
||||
case plainText
|
||||
case headers
|
||||
case paragraphs
|
||||
case matrixIdentifiers
|
||||
case links
|
||||
case textFormatting
|
||||
case blockQuotes
|
||||
case codeBlocks
|
||||
case unorderedList
|
||||
case orderedList
|
||||
|
||||
var rawValue: String {
|
||||
switch self {
|
||||
case .plainText:
|
||||
"""
|
||||
Nothing is as permanent as a temporary solution that works.
|
||||
Experience is the name everyone gives to their mistakes.
|
||||
If debugging is the process of removing bugs, then programming must be the process of putting them in.
|
||||
"""
|
||||
case .headers:
|
||||
"""
|
||||
<h1>H1 Header</h1></br>
|
||||
<h2>H2 Header</h2></br>
|
||||
<h3>H3 Header</h3></br>
|
||||
<h4>H4 Header</h4></br>
|
||||
<h5>H5 Header</h5></br>
|
||||
<h6>H6 Header</h6>
|
||||
"""
|
||||
case .paragraphs:
|
||||
"""
|
||||
<p>This is a paragraph.</p><p>And this is another one.</p>
|
||||
<div>And this is a division.</div>
|
||||
New lines are ignored.\n\nLike so.</br>
|
||||
But this line comes after a line break.</br>
|
||||
"""
|
||||
case .matrixIdentifiers:
|
||||
"""
|
||||
We expect various identifiers to be (partially) detected:</br>
|
||||
!room:matrix.org, #room:matrix.org, $event:matrix.org, @user:matrix.org</br>
|
||||
matrix://roomid/room:matrix.org, matrix://r/room:matrix.org, matrix://roomid/room:matrix.org/e/event:matrix.org, matrix://roomid/room:matrix.org/u/user:matrix.org</br>
|
||||
"""
|
||||
case .links:
|
||||
"""
|
||||
Links too:</br><a href=\"https://www.matrix.org/\">Matrix rules! 🤘</a>, matrix.org, www.matrix.org, http://matrix.org
|
||||
"""
|
||||
case .textFormatting:
|
||||
"""
|
||||
<b>Text</b> <i>formatting</i> <u>should</u> <s>work</s> properly.</br>
|
||||
<strong>Text</strong> <em>formatting</em> does <del>work!</del>.</br>
|
||||
<b>And <i>mixed</i></b> <em><s>formatting</s></em> <del><strong>works</strong></del> <u><b>too!!1!</b></u>.
|
||||
<br>
|
||||
<sup>Thumbs</sup> if you liked it, <sub>sub</sub> if you loved it!
|
||||
"""
|
||||
case .blockQuotes:
|
||||
"""
|
||||
<blockquote>First blockquote with a <a href=\"https://www.matrix.org/\">link</a> in it</blockquote>
|
||||
<blockquote>Second blockquote with a <a href=\"https://www.matrix.org/\">link</a> in it</blockquote>
|
||||
<blockquote>Third blockquote with a <a href=\"https://www.matrix.org/\">link</a> in it</blockquote>
|
||||
"""
|
||||
case .codeBlocks:
|
||||
"""
|
||||
<pre>A preformatted code block<code>struct ContentView: View {
|
||||
var body: some View {
|
||||
VStack {
|
||||
Text("Knock, knock!")
|
||||
.padding()
|
||||
.background(Color.yellow, in: RoundedRectangle(cornerRadius: 8))
|
||||
Text("Who's there?")
|
||||
}
|
||||
.padding()
|
||||
}
|
||||
}</code></pre></br>
|
||||
Followed by some plain code blocks</br>
|
||||
<code>Hello, world!</code>
|
||||
<code><b>Hello</b>, <i>world!</i></code>
|
||||
<code><b>Hello</b>, <a href="https://www.matrix.org">world!</a></code>
|
||||
"""
|
||||
case .unorderedList:
|
||||
"""
|
||||
This is an unordered list
|
||||
<ul>
|
||||
<li>Jones’ <b>Crumpets</b></li>
|
||||
<li><i>Crumpetorium</i></li>
|
||||
<li>Village <u>Bakery</u></li>
|
||||
</ul>
|
||||
"""
|
||||
case .orderedList:
|
||||
"""
|
||||
This is an ordered list
|
||||
<ol>
|
||||
<li>Jelly Belly</li>
|
||||
<li>Starburst</li>
|
||||
<li>Skittles</li>
|
||||
</ol>
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -142,90 +142,8 @@ struct FormattedBodyText_Previews: PreviewProvider, TestablePreview {
|
||||
}
|
||||
|
||||
@ViewBuilder
|
||||
// swiftlint:disable:next function_body_length
|
||||
static func body(_ attributedStringBuilder: AttributedStringBuilderProtocol) -> some View {
|
||||
let htmlStrings = [
|
||||
"""
|
||||
Nothing is as permanent as a temporary solution that works.
|
||||
Experience is the name everyone gives to their mistakes.
|
||||
If debugging is the process of removing bugs, then programming must be the process of putting them in.
|
||||
""",
|
||||
"""
|
||||
<h1>H1 Header</h1></br>
|
||||
<h2>H2 Header</h2></br>
|
||||
<h3>H3 Header</h3></br>
|
||||
<h4>H4 Header</h4></br>
|
||||
<h5>H5 Header</h5></br>
|
||||
<h6>H6 Header</h6>
|
||||
""",
|
||||
"""
|
||||
<p>This is a paragraph.</p><p>And this is another one.</p>
|
||||
<div>And this is a division.</div>
|
||||
New lines are ignored.\n\nLike so.</br>
|
||||
But this line comes after a line break.</br>
|
||||
""",
|
||||
"""
|
||||
We expect various identifiers to be (partially) detected:</br>
|
||||
!room:matrix.org, #room:matrix.org, $event:matrix.org, @user:matrix.org</br>
|
||||
matrix://roomid/room:matrix.org, matrix://r/room:matrix.org, matrix://roomid/room:matrix.org/e/event:matrix.org, matrix://roomid/room:matrix.org/u/user:matrix.org</br>
|
||||
""",
|
||||
"""
|
||||
Links too:</br><a href=\"https://www.matrix.org/\">Matrix rules! 🤘</a>, matrix.org, www.matrix.org, http://matrix.org
|
||||
""",
|
||||
"""
|
||||
<b>Text</b> <i>formatting</i> <u>should</u> <s>work</s> properly.</br>
|
||||
<strong>Text</strong> <em>formatting</em> does <del>work!</del>.</br>
|
||||
<b>And <i>mixed</i></b> <em><s>formatting</s></em> <del><strong>works</strong></del> <u><b>too!!1!</b></u>.
|
||||
<br>
|
||||
<sup>Thumbs</sup> if you liked it, <sub>sub</sub> if you loved it!
|
||||
""",
|
||||
"""
|
||||
Text before blockquote<blockquote><b>Nothing</b> <i>is</i> as permanent as a <u>temporary<u> solution that <a href=\"https://www.matrix.org/\">works.</blockquote>Text after blockquote
|
||||
""",
|
||||
"""
|
||||
<blockquote>First blockquote with a <a href=\"https://www.matrix.org/\">link</a> in it</blockquote>
|
||||
<blockquote>Second blockquote with a <a href=\"https://www.matrix.org/\">link</a> in it</blockquote>
|
||||
<blockquote>Third blockquote with a <a href=\"https://www.matrix.org/\">link</a> in it</blockquote>
|
||||
""",
|
||||
"""
|
||||
<blockquote>A blockquote that is long and goes onto multiple lines </blockquote>
|
||||
<p>Then another line of text to reply to the blockquote, also multiline.</p>
|
||||
<blockquote>Then a short blockquote.</blockquote><p>Followed by another short sentence.</p>
|
||||
""",
|
||||
"""
|
||||
<pre>A preformatted code block<code>struct ContentView: View {
|
||||
var body: some View {
|
||||
VStack {
|
||||
Text("Knock, knock!")
|
||||
.padding()
|
||||
.background(Color.yellow, in: RoundedRectangle(cornerRadius: 8))
|
||||
Text("Who's there?")
|
||||
}
|
||||
.padding()
|
||||
}
|
||||
}</code></pre></br>
|
||||
Followed by some plain code blocks</br>
|
||||
<code>Hello, world!</code>
|
||||
<code><b>Hello</b>, <i>world!</i></code>
|
||||
<code><b>Hello</b>, <a href="https://www.matrix.org">world!</a></code>
|
||||
""",
|
||||
"""
|
||||
This is an unordered list
|
||||
<ul>
|
||||
<li>Jones’ <b>Crumpets</b></li>
|
||||
<li><i>Crumpetorium</i></li>
|
||||
<li>Village <u>Bakery</u></li>
|
||||
</ul>
|
||||
""",
|
||||
"""
|
||||
This is an ordered list
|
||||
<ol>
|
||||
<li>Jelly Belly</li>
|
||||
<li>Starburst</li>
|
||||
<li>Skittles</li>
|
||||
</ol>
|
||||
"""
|
||||
]
|
||||
let htmlStrings = HTMLFixtures.allCases.map(\.rawValue)
|
||||
|
||||
ScrollView {
|
||||
VStack(alignment: .leading, spacing: 4.0) {
|
||||
|
||||
Reference in New Issue
Block a user