Skip to content

Commit 57d0946

Browse files
committed
Escape only relevant attribute values
1 parent 8fc6d7c commit 57d0946

1 file changed

Lines changed: 46 additions & 7 deletions

File tree

Sources/HTMLKit/Framework/Rendering/Renderer.swift

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public struct Renderer {
136136
try render(modifier: modifier, on: &result)
137137

138138
case let value as EnvironmentValue:
139-
result += escape(tainted: .init(try render(envvalue: value), as: .html(.element)))
139+
result += try render(envelement: value)
140140

141141
case let statement as Statement:
142142
try render(statement: statement, on: &result)
@@ -352,9 +352,9 @@ public struct Renderer {
352352
/// - Parameter value: The environment value to resolve
353353
///
354354
/// - Returns: The string representation
355-
private func render(envvalue: EnvironmentValue) throws -> String {
355+
private func render(envattribute value: EnvironmentValue) throws -> String {
356356

357-
let value = try self.environment.resolve(value: envvalue)
357+
let value = try self.environment.resolve(value: value)
358358

359359
switch value {
360360
case let floatValue as Float:
@@ -367,7 +367,43 @@ public struct Renderer {
367367
return String(doubleValue)
368368

369369
case let stringValue as String:
370-
return stringValue
370+
return escape(tainted: .init(stringValue, as: .html(.attribute)))
371+
372+
case let dateValue as Date:
373+
374+
let formatter = DateFormatter()
375+
formatter.timeZone = environment.timeZone ?? TimeZone.current
376+
formatter.dateStyle = .medium
377+
formatter.timeStyle = .short
378+
379+
return formatter.string(from: dateValue)
380+
381+
default:
382+
throw Error.unknownValueType
383+
}
384+
}
385+
386+
/// Renders a environment value
387+
///
388+
/// - Parameter value: The environment value to resolve
389+
///
390+
/// - Returns: The string representation
391+
private func render(envelement value: EnvironmentValue) throws -> String {
392+
393+
let value = try self.environment.resolve(value: value)
394+
395+
switch value {
396+
case let floatValue as Float:
397+
return String(floatValue)
398+
399+
case let intValue as Int:
400+
return String(intValue)
401+
402+
case let doubleValue as Double:
403+
return String(doubleValue)
404+
405+
case let stringValue as String:
406+
return escape(tainted: .init(stringValue, as: .html(.element)))
371407

372408
case let dateValue as Date:
373409

@@ -433,13 +469,16 @@ public struct Renderer {
433469
result += try render(localized: string)
434470

435471
case let value as EnvironmentValue:
436-
result += escape(tainted: .init(try render(envvalue: value), as: .html(.attribute)))
472+
result += try render(envattribute: value)
437473

438474
case let string as TaintedString:
439475
result += escape(tainted: string)
440476

477+
case let string as String:
478+
result += escape(tainted: .init(string, as: .html(.attribute)))
479+
441480
default:
442-
result += escape(tainted: .init("\(attribute.value)", as: .html(.attribute)))
481+
result += "\(attribute.value)"
443482
}
444483

445484
result += "\""
@@ -536,7 +575,7 @@ public struct Renderer {
536575
result += String(doubleValue)
537576

538577
case let stringValue as String:
539-
result += stringValue
578+
result += escape(tainted: .init(stringValue, as: .html(.element)))
540579

541580
case let dateValue as Date:
542581

0 commit comments

Comments
 (0)