Skip to content

Commit e275b6e

Browse files
authored
Merge pull request #4 from ddanilyuk/fix/groupParser
Fix/group parser
2 parents 42c84cb + a28cffd commit e275b6e

10 files changed

Lines changed: 93 additions & 109 deletions

Package.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ let package = Package(
2424
.package(url: "https://github.com/pointfreeco/swift-parsing", revision: "0.9.2"),
2525
.package(url: "https://github.com/pointfreeco/swift-url-routing", from: "0.1.0"),
2626
.package(url: "https://github.com/pointfreeco/vapor-routing", from: "0.1.0"),
27-
// .package(url: "https://github.com/google/swift-benchmark", from: "0.1.1"),
2827
],
2928
targets: [
3029
.target(

Sources/App/Controllers/LessonsController.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// File.swift
2+
// LessonsController.swift
33
//
44
//
55
// Created by Denys Danyliuk on 27.05.2022.
@@ -10,9 +10,9 @@ import KPIHubParser
1010

1111
final class LessonsController {
1212

13-
func getGroups(for uuid: UUID, request: Request) async throws -> LessonsResponse {
13+
func getLessons(for groupUUID: UUID, request: Request) async throws -> LessonsResponse {
1414
let response = try await request.client.get(
15-
"http://rozklad.kpi.ua/Schedules/ViewSchedule.aspx?g=\(uuid.uuidString)"
15+
"http://rozklad.kpi.ua/Schedules/ViewSchedule.aspx?g=\(groupUUID.uuidString)"
1616
)
1717
let html = try (response.body).htmlString(encoding: .utf8)
1818
let lessons = try LessonsParser().parse(html)

Sources/App/routes.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ func apiHandler(
2727
case let .campus(route):
2828
return try await campusHandler(request: request, route: route)
2929

30-
3130
case let .groups(route):
3231
return try await groupsHandler(request: request, route: route)
3332

@@ -84,6 +83,6 @@ func groupHandler(
8483
switch route {
8584
case .lessons:
8685
let controller = LessonsController()
87-
return try await controller.getGroups(for: uuid, request: request)
86+
return try await controller.getLessons(for: uuid, request: request)
8887
}
8988
}

Sources/KPIHubParser/GroupParser.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// File.swift
2+
// GroupParser.swift
33
//
44
//
55
// Created by Denys Danyliuk on 27.05.2022.
@@ -8,7 +8,11 @@
88
import Foundation
99
import Parsing
1010

11-
public struct GroupParser: Parser {
11+
public struct GroupParser: Parser, Equatable {
12+
13+
typealias Input = String
14+
15+
typealias Output = [Group]
1216

1317
public let groupName: String
1418

@@ -47,5 +51,9 @@ public struct GroupParser: Parser {
4751
}
4852
return try parser.parse(input)
4953
}
54+
55+
static func == (lhs: GroupParser, rhs: GroupParser) -> Bool {
56+
return lhs.groupName == rhs.groupName
57+
}
5058

5159
}

Sources/KPIHubParser/LessonsParser.swift

Lines changed: 66 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,12 @@ public struct LessonsParser: Parser {
3333
// MARK: - Lesson name
3434

3535
let nameParser = Parse {
36-
OpenTagV2("a")
36+
OpenTag("a")
3737
upToNextTag.map { String(Substring($0)) }
38-
CloseTagV2("a")
38+
CloseTag("a")
3939
}
4040
let multipleNamesParser = Parse {
41-
OpenTagV2("span")
41+
OpenTag("span")
4242
Many {
4343
nameParser
4444
} separator: {
@@ -48,7 +48,7 @@ public struct LessonsParser: Parser {
4848
} terminator: {
4949
Skip { PrefixThrough("</span>".utf8) }
5050
}
51-
OneLineTagV2("br")
51+
OneLineTag("br")
5252
}
5353

5454
// MARK: - Teacher
@@ -61,11 +61,11 @@ public struct LessonsParser: Parser {
6161
upToNextTag.map { String(Substring($0)) }
6262
}
6363
let teacherParser = Parse(Teacher.init) {
64-
OpenTagV2("a") {
64+
OpenTag("a") {
6565
teacherFullNameParser
6666
}
6767
teacherShortNameParser
68-
CloseTagV2("a")
68+
CloseTag("a")
6969
}
7070
let multipleTeachersParser = Parse {
7171
Optionally {
@@ -77,15 +77,15 @@ public struct LessonsParser: Parser {
7777
Peek { "<a".utf8 }
7878
}
7979
}
80-
OneLineTagV2("br")
80+
OneLineTag("br")
8181
}
8282

8383
// MARK: - Location
8484

8585
let locationWithLinkParser = Parse {
86-
OpenTagV2("a")
86+
OpenTag("a")
8787
upToNextTag.map { String(Substring($0)) }
88-
CloseTagV2("a")
88+
CloseTag("a")
8989
}
9090
let locationPlainTextParser = Parse {
9191
Whitespace()
@@ -109,36 +109,36 @@ public struct LessonsParser: Parser {
109109
// MARK: - Lesson
110110

111111
let lessonCellParser = Parse {
112-
OpenTagV2("td")
112+
OpenTag("td")
113113
Optionally {
114114
Parse(RawLesson.init) {
115115
multipleNamesParser
116116
multipleTeachersParser
117117
multipleLocationParser
118118
}
119119
}
120-
CloseTagV2("td")
120+
CloseTag("td")
121121
}
122122

123123
// MARK: - Row
124124

125125
/// Cell with pair number and time
126126
let skipFirstCell = Parse {
127-
OpenTagV2("td")
127+
OpenTag("td")
128128
Skip { PrefixThrough("</td>".utf8) }
129129
}
130130

131131
let rowParser = Parse {
132132
Parse {
133133
Whitespace()
134-
OpenTagV2("tr")
134+
OpenTag("tr")
135135
Whitespace()
136136
}
137137
skipFirstCell
138138
Many(6, element: { lessonCellParser })
139139
Parse {
140140
Whitespace()
141-
CloseTagV2("tr")
141+
CloseTag("tr")
142142
Whitespace()
143143
}
144144
}
@@ -215,3 +215,55 @@ public struct LessonsParser: Parser {
215215
}
216216

217217
}
218+
219+
220+
public func parse(_ input: inout String) throws -> [Lesson] {
221+
222+
let upToNextTag = PrefixUpTo("<".utf8)
223+
let quotedField = Parse { ... }
224+
225+
// MARK: - Lesson name
226+
227+
let nameParser = Parse { ... }
228+
let multipleNamesParser = Parse { ... }
229+
230+
// MARK: - Teacher
231+
232+
let teacherFullNameParser = Parse { ... }
233+
let teacherShortNameParser = Parse { ... }
234+
let teacherParser = Parse(Teacher.init) { ... }
235+
let multipleTeachersParser = Parse { ... }
236+
237+
// MARK: - Location
238+
239+
let locationWithLinkParser = Parse { ... }
240+
let locationPlainTextParser = Parse { ... }
241+
let multipleLocationParser = Parse { ... }
242+
243+
// MARK: - Lesson
244+
245+
let lessonCellParser = Parse { ... }
246+
247+
// MARK: - Row
248+
249+
/// Cell with pair number and time
250+
let skipFirstCell = Parse { ... }
251+
252+
let rowParser = Parse { ... }
253+
254+
// MARK: - Table
255+
256+
let skipTableHeader = Parse { ... }
257+
258+
let firstTable = Parse { ... }
259+
.replaceError( ... )
260+
261+
let secondTable = Parse { ... }
262+
.replaceError( ... )
263+
264+
let allTables = Parse { ... } with: { ... }
265+
266+
let fullParser = allTables.map { ... }
267+
268+
return try fullParser.parse(input)
269+
}

Sources/KPIHubParser/StudySheetActivitiesParser.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ public struct StudySheetActivitiesParser: Parser {
2626

2727
let fieldParser = Parse {
2828
Whitespace()
29-
OpenTagV2("td")
29+
OpenTag("td")
3030
upToNextTag
31-
CloseTagV2("td")
31+
CloseTag("td")
3232
Whitespace()
3333
}
3434
let allFieldsParser = Parse { date, mark, type, teacher, note in
@@ -49,13 +49,13 @@ public struct StudySheetActivitiesParser: Parser {
4949

5050
let rowsParser = Many {
5151
Whitespace()
52-
OpenTagV2("tr")
52+
OpenTag("tr")
5353
Parse {
5454
Whitespace()
5555
allFieldsParser
5656
Whitespace()
5757
}
58-
CloseTagV2("tr")
58+
CloseTag("tr")
5959
Whitespace()
6060
}
6161

Sources/KPIHubParser/StudySheetLessonsParser.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,26 +69,26 @@ public struct StudySheetLessonsParser: Parser {
6969
let idLinkNameParser = Parse { idLink, name in
7070
IdLinkName(idLink: idLink, name: name)
7171
} with: {
72-
OpenTagV2("td")
73-
OpenTagV2("a") {
72+
OpenTag("td")
73+
OpenTag("a") {
7474
Skip { PrefixThrough("=".utf8) }
7575
idLinkParser
7676
}
7777
upToNextTag
78-
CloseTagV2("a")
79-
CloseTagV2("td")
78+
CloseTag("a")
79+
CloseTag("td")
8080
}
8181

8282
let teacherParser = Parse {
83-
OpenTagV2("td")
83+
OpenTag("td")
8484
Many {
8585
Prefix { $0 != .init(ascii: "<") && $0 != .init(ascii: ",") }
8686
.map { String(Substring($0)) }
8787
} separator: {
8888
",".utf8
8989
Whitespace()
9090
}
91-
CloseTagV2("td")
91+
CloseTag("td")
9292
}
9393

9494
let oneRowParser = Parse { trHeader, idLinkName, teachers in
@@ -103,7 +103,7 @@ public struct StudySheetLessonsParser: Parser {
103103
} with: {
104104
Whitespace()
105105
Parse {
106-
OpenTagV2("tr") {
106+
OpenTag("tr") {
107107
trHeaderParser
108108
}
109109
Whitespace()
@@ -116,7 +116,7 @@ public struct StudySheetLessonsParser: Parser {
116116
teacherParser
117117
Whitespace()
118118
}
119-
CloseTagV2("tr")
119+
CloseTag("tr")
120120
}
121121

122122

Sources/KPIHubParser/TagParsers/CloseTag.swift

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,6 @@ import Foundation
1010

1111
struct CloseTag: Parser {
1212

13-
typealias Input = Substring
14-
typealias Output = Void
15-
16-
let tag: String
17-
18-
init(_ tag: String) {
19-
self.tag = tag
20-
}
21-
22-
func parse(_ input: inout Substring) throws -> Void {
23-
try Parse {
24-
"</\(tag)>"
25-
}
26-
.parse(&input)
27-
}
28-
}
29-
30-
struct CloseTagV2: Parser {
31-
3213
typealias Input = Substring.UTF8View
3314
typealias Output = Void
3415

@@ -44,4 +25,5 @@ struct CloseTagV2: Parser {
4425
}
4526
.parse(&input)
4627
}
28+
4729
}

Sources/KPIHubParser/TagParsers/OneLineTag.swift

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,6 @@ struct OneLineTag: Parser {
1616
self.tag = tag
1717
}
1818

19-
typealias Input = Substring
20-
typealias Output = Void
21-
22-
func parse(_ input: inout Substring) throws -> Void {
23-
try Parse {
24-
"<\(tag)/>"
25-
}
26-
.parse(&input)
27-
}
28-
}
29-
30-
struct OneLineTagV2: Parser {
31-
32-
let tag: String
33-
34-
init(_ tag: String) {
35-
self.tag = tag
36-
}
37-
3819
typealias Input = Substring.UTF8View
3920
typealias Output = Void
4021

0 commit comments

Comments
 (0)