From bed65a40a47147929d6aedea51f7822a60244d1a Mon Sep 17 00:00:00 2001 From: Mattes Mohr Date: Mon, 12 Jan 2026 21:57:34 +0100 Subject: [PATCH 1/5] Introduce an escape context --- .../Framework/Rendering/EscapeContext.swift | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Sources/HTMLKit/Framework/Rendering/EscapeContext.swift diff --git a/Sources/HTMLKit/Framework/Rendering/EscapeContext.swift b/Sources/HTMLKit/Framework/Rendering/EscapeContext.swift new file mode 100644 index 00000000..4c77f272 --- /dev/null +++ b/Sources/HTMLKit/Framework/Rendering/EscapeContext.swift @@ -0,0 +1,25 @@ +/// A companion type that informs about trusted or tainted content. +public enum EscapeContext { + + /// The subcontext that describes the content. + public enum Subcontext { + + /// Consider an HTML context. + case html + + /// Consider a CSS context. + case css + + /// Consider a JS context. + case js + + /// Consider a URL context. + case url + } + + /// Whether the content is considered trusted. + case trusted + + /// Whether the content is considered tainted. + case tainted(Subcontext) +} From 99feb0f30edc650a452e066ea34c2d0461257e76 Mon Sep 17 00:00:00 2001 From: Mattes Mohr Date: Fri, 16 Jan 2026 10:04:40 +0100 Subject: [PATCH 2/5] Make the elements context aware --- .../Abstraction/Elements/BasicElements.swift | 26 +- .../Abstraction/Elements/BodyElements.swift | 598 +++++++++++++++--- .../Elements/DefinitionElements.swift | 16 +- .../Abstraction/Elements/FigureElements.swift | 8 +- .../Abstraction/Elements/FormElements.swift | 44 +- .../Abstraction/Elements/HeadElements.swift | 22 +- .../Abstraction/Elements/HtmlElements.swift | 18 +- .../Abstraction/Elements/InputElements.swift | 30 +- .../Abstraction/Elements/ListElements.swift | 8 +- .../Abstraction/Elements/RubyElements.swift | 16 +- .../Abstraction/Elements/TableElements.swift | 82 ++- .../Abstraction/Elements/VectorElements.swift | 72 ++- .../Primitives/Attributes/Attribute.swift | 8 +- .../Framework/Primitives/Nodes/Nodes.swift | 24 +- .../Framework/Rendering/Renderer.swift | 112 +++- Tests/HTMLKitTests/AttributesTests.swift | 8 +- 16 files changed, 958 insertions(+), 134 deletions(-) diff --git a/Sources/HTMLKit/Abstraction/Elements/BasicElements.swift b/Sources/HTMLKit/Abstraction/Elements/BasicElements.swift index 1b1725e0..95880cc7 100644 --- a/Sources/HTMLKit/Abstraction/Elements/BasicElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/BasicElements.swift @@ -8,14 +8,18 @@ import OrderedCollections /// ```swift /// Comment("Lorem ipsum") /// ``` -public struct Comment: CommentNode, GlobalElement { +public struct Comment: CommentNode, GlobalElement { internal var content: String + internal var context: EscapeContext + /// Create a comment. /// /// - Parameter content: The text of the comment. public init(_ content: String) { + + self.context = .tainted(.html) self.content = content } } @@ -37,10 +41,14 @@ public struct Document: DocumentNode, BasicElement { internal var content: String + internal var context: EscapeContext + /// Create a document. /// /// - Parameter value: The type to declare. public init(_ value: Values.Doctype) { + + self.context = .trusted self.content = value.rawValue } } @@ -74,16 +82,22 @@ public struct Html: ContentNode, BasicElement { internal var attributes: OrderedDictionary? internal var content: [HtmlElement] + + internal var context: EscapeContext /// Create a html. /// /// - Parameter content: The html's content. public init(@ContentBuilder content: () -> [HtmlElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [HtmlElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [HtmlElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -317,22 +331,26 @@ public struct Custom: CustomNode, GlobalElement { public var attributes: OrderedDictionary? public var content: [Content] + + public var context: EscapeContext /// Create a custom. /// /// - Parameters: /// - name: The tag to use for the element. /// - content: The custom's content. - public init(name: String, @ContentBuilder content: () -> [Content]) { + public init(name: String, context: EscapeContext = .tainted(.html), @ContentBuilder content: () -> [Content]) { self.name = name + self.context = context self.content = content() } - public init(name: String, attributes: OrderedDictionary?, content: [Content]) { + public init(name: String, attributes: OrderedDictionary?, context: EscapeContext = .tainted(.html), content: [Content]) { self.name = name self.attributes = attributes + self.context = context self.content = content } diff --git a/Sources/HTMLKit/Abstraction/Elements/BodyElements.swift b/Sources/HTMLKit/Abstraction/Elements/BodyElements.swift index e7b1bb27..f8fe5b5a 100644 --- a/Sources/HTMLKit/Abstraction/Elements/BodyElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/BodyElements.swift @@ -166,16 +166,22 @@ public struct Article: ContentNode, HtmlElement, BodyElement, FormElement, Figur internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a article. /// /// - Parameter content: The article's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -491,16 +497,22 @@ public struct Section: ContentNode, HtmlElement, BodyElement, FigureElement, For internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a section. /// /// - Parameter content: The section's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -818,16 +830,22 @@ public struct Navigation: ContentNode, HtmlElement, BodyElement, FormElement, Fi internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a navigation. /// /// - Parameter content: The navigation's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -1141,16 +1159,22 @@ public struct Aside: ContentNode, HtmlElement, BodyElement, FormElement, FigureE internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a aside. /// /// - Parameter content: The aside's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -1461,16 +1485,22 @@ public struct Heading1: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a heading. /// /// - Parameter content: The heading's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -1768,6 +1798,8 @@ extension Heading1: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttribute extension Heading1: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -1788,16 +1820,22 @@ public struct Heading2: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a heading. /// /// - Parameter content: The heading's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -2095,6 +2133,8 @@ extension Heading2: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttribute extension Heading2: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -2115,16 +2155,22 @@ public struct Heading3: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a heading. /// /// - Parameter content: The heading's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -2422,6 +2468,8 @@ extension Heading3: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttribute extension Heading3: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -2442,16 +2490,22 @@ public struct Heading4: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a heading. /// /// - Parameter content: The heading's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -2749,6 +2803,8 @@ extension Heading4: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttribute extension Heading4: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -2769,16 +2825,22 @@ public struct Heading5: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a heading. /// /// - Parameter content: The heading's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -3076,6 +3138,8 @@ extension Heading5: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttribute extension Heading5: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -3096,16 +3160,22 @@ public struct Heading6: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a heading. /// /// - Parameter content: The heading's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -3403,6 +3473,8 @@ extension Heading6: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttribute extension Heading6: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -3428,16 +3500,22 @@ public struct HeadingGroup: ContentNode, HtmlElement, BodyElement, FormElement, internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a heading group. /// /// - Parameter content: The group's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -3749,16 +3827,22 @@ public struct Header: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a header. /// /// - Parameter content: The header's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -4068,16 +4152,22 @@ public struct Footer: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a footer. /// /// - Parameter content: The footer's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -4394,16 +4484,22 @@ public struct Address: ContentNode, HtmlElement, BodyElement, FormElement, Figur internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create an address. /// /// - Parameter content: The address's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -4714,16 +4810,22 @@ public struct Paragraph: ContentNode, HtmlElement, BodyElement, FormElement, Fig internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a paragraph. /// /// - Parameter content: The paragraph's content public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -5021,6 +5123,8 @@ extension Paragraph: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttribut extension Paragraph: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -5364,16 +5468,22 @@ public struct PreformattedText: ContentNode, HtmlElement, BodyElement, FormEleme internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a preformatted text. /// /// - Parameter content: The text's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -5684,16 +5794,22 @@ public struct Blockquote: ContentNode, HtmlElement, BodyElement, FormElement, Fi internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a block quote. /// /// - Parameter content: The quote's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -5995,6 +6111,8 @@ extension Blockquote: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttribu extension Blockquote: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -6020,16 +6138,22 @@ public struct OrderedList: ContentNode, HtmlElement, BodyElement, FormElement, F internal var attributes: OrderedDictionary? internal var content: [ListElement] + + internal var context: EscapeContext /// Create a ordered list. /// /// - Parameter content: The list's content. public init(@ContentBuilder content: () -> [ListElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [ListElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [ListElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -6357,16 +6481,22 @@ public struct UnorderedList: ContentNode, HtmlElement, BodyElement, FormElement, internal var attributes: OrderedDictionary? internal var content: [ListElement] + + internal var context: EscapeContext /// Create a unordered list. /// /// - Parameter content: The list's content. public init(@ContentBuilder content: () -> [ListElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [ListElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [ListElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -6688,16 +6818,22 @@ public struct Menu: ContentNode, HtmlElement, BodyElement { internal var attributes: OrderedDictionary? internal var content: [ListElement] + + internal var context: EscapeContext /// Create a menu. /// /// - Parameter content: The menu's content. public init(@ContentBuilder content: () -> [ListElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [ListElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [ListElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -6919,16 +7055,22 @@ public struct DescriptionList: ContentNode, HtmlElement, BodyElement, FormElemen internal var attributes: OrderedDictionary? internal var content: [DescriptionElement] + + internal var context: EscapeContext /// Create a description list /// /// - Parameter content: The list's content. public init(@ContentBuilder content: () -> [DescriptionElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [DescriptionElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [DescriptionElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -7244,16 +7386,22 @@ public struct Figure: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var attributes: OrderedDictionary? internal var content: [FigureElement] + + internal var context: EscapeContext /// Create a figure. /// /// - Parameter content: The figure's content. public init(@ContentBuilder content: () -> [FigureElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [FigureElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [FigureElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -7566,16 +7714,22 @@ public struct Anchor: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create an anchor. /// /// - Parameter content: The anchor's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -7917,6 +8071,8 @@ extension Anchor: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, extension Anchor: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -7941,16 +8097,22 @@ public struct Emphasize: ContentNode, HtmlElement, BodyElement, FormElement, Fig internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a emphasize. /// /// - Parameter content: The emphasize's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -8263,16 +8425,22 @@ public struct Strong: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a strong. /// /// - Parameter content: The strong's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -8585,16 +8753,22 @@ public struct Small: ContentNode, HtmlElement, BodyElement, FormElement, FigureE internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a small. /// /// - Parameter content: The small's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -8892,6 +9066,8 @@ extension Small: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { extension Small: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -8914,16 +9090,22 @@ public struct StrikeThrough: ContentNode, HtmlElement, BodyElement, FormElement, internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a strike through. /// /// - Parameter content: The strike through's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -9145,6 +9327,8 @@ extension StrikeThrough: GlobalAttributes, GlobalEventAttributes { extension StrikeThrough: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -9175,16 +9359,22 @@ public struct Main: ContentNode, HtmlElement, BodyElement, FormElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a main. /// /// - Parameter content: The main's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -9502,16 +9692,22 @@ public struct Search: ContentNode, HtmlElement, BodyElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a search. /// /// - Parameter content: The search's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -9726,16 +9922,22 @@ public struct Division: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a division. /// /// - Parameter content: The division's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -10051,16 +10253,22 @@ public struct Definition: ContentNode, HtmlElement, BodyElement, FormElement, Fi internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a definition. /// /// - Parameter content: The definition's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -10374,16 +10582,22 @@ public struct Cite: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a cite. /// /// - Parameter content: The cite's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -10696,16 +10910,22 @@ public struct ShortQuote: ContentNode, HtmlElement, BodyElement, FormElement, Fi internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a short quote. /// /// - Parameter content: The quote's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -11023,16 +11243,22 @@ public struct Abbreviation: ContentNode, HtmlElement, BodyElement, FormElement, internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a abbreviation. /// /// - Parameter content: The abbreviation's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -11346,16 +11572,22 @@ public struct Ruby: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var attributes: OrderedDictionary? internal var content: [RubyElement] + + internal var context: EscapeContext /// Create a ruby. /// /// - Parameter content: The ruby's content. public init(@ContentBuilder content: () -> [RubyElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [RubyElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [RubyElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -11672,15 +11904,21 @@ public struct Data: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var content: [Content] + internal var context: EscapeContext + /// Create a data. /// /// - Parameter content: The data's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -12009,15 +12247,21 @@ public struct Time: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var content: [Content] + internal var context: EscapeContext + /// Create a time. /// /// - Parameter content: The time's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -12336,16 +12580,22 @@ public struct Code: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a code. /// /// - Parameter content: The code's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -12660,16 +12910,22 @@ public struct Variable: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a variable. /// /// - Parameter content: The variable's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -12980,16 +13236,22 @@ public struct SampleOutput: ContentNode, HtmlElement, BodyElement, FormElement, internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a sample output. /// /// - Parameter content: The output's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -13304,16 +13566,22 @@ public struct KeyboardInput: ContentNode, HtmlElement, BodyElement, FormElement, internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a keyboard input. /// /// - Parameter content: The input's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -13628,16 +13896,22 @@ public struct Subscript: ContentNode, HtmlElement, BodyElement, FormElement, Fig internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a subscript. /// /// - Parameter content: The subscript's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -13951,16 +14225,22 @@ public struct Superscript: ContentNode, HtmlElement, BodyElement, FormElement, F internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a superscript. /// /// - Parameter content: The superscript's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -14275,16 +14555,22 @@ public struct Italic: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a italic. /// /// - Parameter content: The italic's content public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -14582,6 +14868,8 @@ extension Italic: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes extension Italic: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -14606,16 +14894,22 @@ public struct Bold: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a bold. /// /// - Parameter content: The bold's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -14913,6 +15207,8 @@ extension Bold: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { extension Bold: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -14938,15 +15234,21 @@ public struct Underline: ContentNode, HtmlElement, BodyElement, FormElement, Fig internal var content: [Content] + internal var context: EscapeContext + /// Create a underline. /// /// - Parameter content: The underline's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -15244,6 +15546,8 @@ extension Underline: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttribut extension Underline: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -15269,15 +15573,21 @@ public struct Mark: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var content: [Content] + internal var context: EscapeContext + /// Create a mark. /// /// - Parameter content: The mark's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -15592,16 +15902,22 @@ public struct Bdi: ContentNode, HtmlElement, BodyElement, FormElement, FigureEle internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a bidirectional isolate. /// /// - Parameter content: The isolate's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -16230,16 +16546,22 @@ public struct Span: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a span. /// /// - Parameter content: The span's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -17176,16 +17498,22 @@ public struct InsertedText: ContentNode, HtmlElement, BodyElement, FormElement, internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a inserted text. /// /// - Parameter content: The text's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -17504,16 +17832,22 @@ public struct DeletedText: ContentNode, HtmlElement, BodyElement, FormElement, F internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a deleted text. /// /// - Parameter content: The text's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -17837,16 +18171,22 @@ public struct Picture: ContentNode, HtmlElement, BodyElement, FormElement, Figur internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a picture. /// /// - Parameter content: The picture's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -18474,16 +18814,22 @@ public struct InlineFrame: ContentNode, HtmlElement, BodyElement, FormElement, F internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a inline frame. /// /// - Parameter content: The frame's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -19172,16 +19518,22 @@ public struct Object: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var attributes: OrderedDictionary? internal var content: [ObjectElement] + + internal var context: EscapeContext /// Create a object. /// /// - Parameter content: The object's content. public init(@ContentBuilder content: () -> [ObjectElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [ObjectElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [ObjectElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -19518,16 +19870,22 @@ public struct Video: ContentNode, HtmlElement, BodyElement, FormElement, FigureE internal var attributes: OrderedDictionary? internal var content: [MediaElement] + + internal var context: EscapeContext /// Create a video. /// /// - Parameter content: The video's content. public init(@ContentBuilder content: () -> [MediaElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [MediaElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [MediaElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -19899,16 +20257,22 @@ public struct Audio: ContentNode, HtmlElement, BodyElement, FormElement, FigureE internal var attributes: OrderedDictionary? internal var content: [MediaElement] + + internal var context: EscapeContext /// Create an audio. /// /// - Parameter content: The audio's content. public init(@ContentBuilder content: () -> [MediaElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [MediaElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [MediaElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -20269,15 +20633,21 @@ public struct Map: ContentNode, HtmlElement, BodyElement, FormElement, FigureEle internal var content: [MapElement] + internal var context: EscapeContext + /// Create a map. /// /// - Parameter content: The map's content. public init(@ContentBuilder content: () -> [MapElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [MapElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [MapElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -20522,16 +20892,22 @@ public struct Form: ContentNode, HtmlElement, BodyElement, FigureElement, Object internal var attributes: OrderedDictionary? internal var content: [FormElement] + + internal var context: EscapeContext /// Create a form. /// /// - Parameter content: The form's content. public init(@ContentBuilder content: () -> [FormElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [FormElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [FormElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -20881,16 +21257,22 @@ public struct DataList: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a data list. /// /// - Parameter content: The list's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -21203,16 +21585,22 @@ public struct Output: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a output. /// /// - Parameter content: The output's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -21537,16 +21925,22 @@ public struct Progress: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a progress. /// /// - Parameter content: The progress's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -21878,16 +22272,22 @@ public struct Meter: ContentNode, HtmlElement, BodyElement, FormElement, FigureE internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a meter. /// /// - Parameter content: The meter's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -22236,16 +22636,22 @@ public struct Details: ContentNode, HtmlElement, BodyElement, FormElement, Figur internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a details. /// /// - Parameter content: The details's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -22585,15 +22991,21 @@ public struct Dialog: ContentNode, BodyElement { internal var content: [Content] + internal var context: EscapeContext + /// Create a dialog. /// /// - Parameter content: The dialog's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -22923,16 +23335,22 @@ public struct Script: ContentNode, HeadElement, BodyElement, FormElement, Figure internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a script. /// /// - Parameter content: The script's content. public init(@ContentBuilder content: () -> [String]) { - self.content = [TaintedString(content().joined(), as: .js(.element))] + + self.context = .tainted(.js) + self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -23213,16 +23631,22 @@ public struct NoScript: ContentNode, HtmlElement, HeadElement, BodyElement, Form internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a no script. /// /// - Parameter content: The script's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -23465,15 +23889,21 @@ public struct Template: ContentNode, BodyElement, FormElement, FigureElement, Ob internal var content: [Content] + internal var context: EscapeContext + /// Create a template. /// /// - Parameter content: The template's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -23711,13 +24141,19 @@ public struct Canvas: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -24044,15 +24480,21 @@ public struct Table: ContentNode, HtmlElement, BodyElement, FormElement, FigureE internal var content: [TableElement] + internal var context: EscapeContext + /// Create a table. /// /// - Parameter content: The table's content. public init(@ContentBuilder content: () -> [TableElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [TableElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [TableElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -24378,15 +24820,21 @@ public struct Vector: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var content: [VectorElement] + internal var context: EscapeContext + /// Create a vector. /// /// - Parameter content: The vector's content. public init(@ContentBuilder content: () -> [VectorElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [VectorElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [VectorElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -24521,16 +24969,22 @@ public struct Slot: ContentNode, BodyElement, FormElement, FigureElement, Object internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a slot. /// /// - Parameter content: The slot's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } diff --git a/Sources/HTMLKit/Abstraction/Elements/DefinitionElements.swift b/Sources/HTMLKit/Abstraction/Elements/DefinitionElements.swift index 5333d486..a03aee84 100644 --- a/Sources/HTMLKit/Abstraction/Elements/DefinitionElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/DefinitionElements.swift @@ -31,15 +31,21 @@ public struct TermName: ContentNode, DescriptionElement { internal var content: [Content] + internal var context: EscapeContext + /// Create a term name. /// /// - Parameter content: The name's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -356,15 +362,21 @@ public struct TermDefinition: ContentNode, DescriptionElement { internal var content: [Content] + internal var context: EscapeContext + /// Creates a term definition. /// /// - Parameter content: The definition's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } diff --git a/Sources/HTMLKit/Abstraction/Elements/FigureElements.swift b/Sources/HTMLKit/Abstraction/Elements/FigureElements.swift index 812980e4..3d54b2df 100644 --- a/Sources/HTMLKit/Abstraction/Elements/FigureElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/FigureElements.swift @@ -27,15 +27,21 @@ public struct FigureCaption: ContentNode, FigureElement { internal var content: [Content] + internal var context: EscapeContext + /// Create a figure caption. /// /// - Parameter content: The caption's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } diff --git a/Sources/HTMLKit/Abstraction/Elements/FormElements.swift b/Sources/HTMLKit/Abstraction/Elements/FormElements.swift index 42e9d21a..67fd3b50 100644 --- a/Sources/HTMLKit/Abstraction/Elements/FormElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/FormElements.swift @@ -442,16 +442,22 @@ public struct Label: ContentNode, FormElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a label. /// /// - Parameter content: The label's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -753,6 +759,8 @@ extension Label: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, extension Label: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -783,15 +791,21 @@ public struct Select: ContentNode, FormElement { internal var content: [Content] + internal var context: EscapeContext + /// Create a select. /// /// - Parameter content: The select's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -1071,15 +1085,21 @@ public struct TextArea: ContentNode, FormElement { internal var content: [String] + internal var context: EscapeContext + /// Create a text area. /// /// - Parameter content: The area's content. public init(@ContentBuilder content: () -> [String]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [String]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [String]) { + self.attributes = attributes + self.context = context self.content = content } @@ -1472,15 +1492,21 @@ public struct Button: ContentNode, FormElement { internal var content: [Content] + internal var context: EscapeContext + /// Create a button. /// /// - Parameter content: The button's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -1825,6 +1851,8 @@ extension Button: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, extension Button: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -1856,15 +1884,21 @@ public struct Fieldset: ContentNode, FormElement { internal var content: [Content] + internal var context: EscapeContext + /// Create a fieldset. /// /// - Parameter content: The set's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } diff --git a/Sources/HTMLKit/Abstraction/Elements/HeadElements.swift b/Sources/HTMLKit/Abstraction/Elements/HeadElements.swift index 7402215e..4d3f04a9 100644 --- a/Sources/HTMLKit/Abstraction/Elements/HeadElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/HeadElements.swift @@ -20,15 +20,21 @@ public struct Title: ContentNode, HeadElement, VectorElement { internal var content: [Content] + internal var context: EscapeContext + /// Create a title. /// /// - Parameter content: The title's content. public init(@ContentBuilder content: () -> [String]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -250,6 +256,8 @@ extension Title: GlobalAttributes, GlobalEventAttributes { extension Title: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } @@ -784,12 +792,16 @@ public struct Style: ContentNode, HeadElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a style. /// /// - Parameter content: The style's content. @available(*, deprecated, message: "Use the init(content:) -> [String] initializer instead.") public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.css) self.content = content() } @@ -797,11 +809,15 @@ public struct Style: ContentNode, HeadElement { /// /// - Parameter content: The style's content. public init(@ContentBuilder content: () -> [String]) { - self.content = [TaintedString(content().joined(), as: .css(.element))] + + self.context = .tainted(.css) + self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } diff --git a/Sources/HTMLKit/Abstraction/Elements/HtmlElements.swift b/Sources/HTMLKit/Abstraction/Elements/HtmlElements.swift index d0737990..57a3ba5d 100644 --- a/Sources/HTMLKit/Abstraction/Elements/HtmlElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/HtmlElements.swift @@ -10,7 +10,7 @@ import OrderedCollections /// } /// } /// ``` -public struct Head: ContentNode, HtmlElement { +public struct Head: ContentNode, HtmlElement { internal var name: String { "head" } @@ -18,15 +18,21 @@ public struct Head: ContentNode, HtmlElement { internal var content: [HeadElement] + internal var context: EscapeContext + /// Create a head. /// /// - Parameter content: The head's content. public init(@ContentBuilder content: () -> [HeadElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [HeadElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [HeadElement]) { + self.attributes = attributes + self.context = context self.content = content } @@ -266,16 +272,22 @@ public struct Body: ContentNode, HtmlElement { internal var attributes: OrderedDictionary? internal var content: [BodyElement] + + internal var context: EscapeContext /// Create a body. /// /// - Parameter content: The body's content. public init(@ContentBuilder content: () -> [BodyElement]) { + + self.context = .trusted self.content = content() } - internal init(attributes: OrderedDictionary?, content: [BodyElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [BodyElement]) { + self.attributes = attributes + self.context = context self.content = content } diff --git a/Sources/HTMLKit/Abstraction/Elements/InputElements.swift b/Sources/HTMLKit/Abstraction/Elements/InputElements.swift index d8519dac..ab14de11 100644 --- a/Sources/HTMLKit/Abstraction/Elements/InputElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/InputElements.swift @@ -32,16 +32,22 @@ public struct OptionGroup: ContentNode, InputElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a option group. /// /// - Parameter content: The group's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -377,16 +383,22 @@ public struct Option: ContentNode, InputElement { internal var attributes: OrderedDictionary? internal var content: [String] + + internal var context: EscapeContext /// Create a option. /// /// - Parameter content: The option's content. public init(@ContentBuilder content: () -> [String]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [String]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [String]) { + self.attributes = attributes + self.context = context self.content = content } @@ -754,18 +766,22 @@ public struct Legend: ContentNode, InputElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a legend. /// /// - Parameter content: The legend's content. public init(@ContentBuilder content: () -> [Content]) { + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes + self.context = context self.content = content } @@ -1081,16 +1097,22 @@ public struct Summary: ContentNode, InputElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a summary. /// /// - Parameter content: The summary's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } diff --git a/Sources/HTMLKit/Abstraction/Elements/ListElements.swift b/Sources/HTMLKit/Abstraction/Elements/ListElements.swift index 05cd2d66..ff16fe2e 100644 --- a/Sources/HTMLKit/Abstraction/Elements/ListElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/ListElements.swift @@ -27,15 +27,21 @@ public struct ListItem: ContentNode, ListElement { internal var content: [Content] + internal var context: EscapeContext + /// Create a list item. /// /// - Parameter content: The item's content public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } diff --git a/Sources/HTMLKit/Abstraction/Elements/RubyElements.swift b/Sources/HTMLKit/Abstraction/Elements/RubyElements.swift index 68ad30b7..add43bae 100644 --- a/Sources/HTMLKit/Abstraction/Elements/RubyElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/RubyElements.swift @@ -28,16 +28,22 @@ public struct RubyText: ContentNode, RubyElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a ruby text. /// /// - Parameter content: The text's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -358,15 +364,21 @@ public struct RubyPronunciation: ContentNode, RubyElement { internal var content: [Content] + internal var context: EscapeContext + /// Create a ruby pronunciation. /// /// - Parameter content: The pronunciation's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } diff --git a/Sources/HTMLKit/Abstraction/Elements/TableElements.swift b/Sources/HTMLKit/Abstraction/Elements/TableElements.swift index 620c1a66..eec5adce 100644 --- a/Sources/HTMLKit/Abstraction/Elements/TableElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/TableElements.swift @@ -50,17 +50,23 @@ public struct Caption: ContentNode, TableElement { internal var attributes: OrderedDictionary? - internal var content: [Content] + internal var content: [Content] + + internal var context: EscapeContext /// Create a caption. /// /// - Parameter content: The caption's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -374,17 +380,23 @@ public struct ColumnGroup: ContentNode, TableElement { internal var attributes: OrderedDictionary? - internal var content: [Content] + internal var content: [Content] + + internal var context: EscapeContext /// Create a column group. /// /// - Parameter content: The group's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -876,17 +888,23 @@ public struct TableBody: ContentNode, TableElement { internal var attributes: OrderedDictionary? - internal var content: [Content] + internal var content: [Content] + + internal var context: EscapeContext /// Create a table body. /// /// - Parameter content: The body's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -1217,17 +1235,23 @@ public struct TableHead: ContentNode, TableElement { internal var attributes: OrderedDictionary? - internal var content: [Content] + internal var content: [Content] + + internal var context: EscapeContext /// Create a table head. /// /// - Parameter content: The head's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -1558,17 +1582,23 @@ public struct TableFoot: ContentNode, TableElement { internal var attributes: OrderedDictionary? - internal var content: [Content] + internal var content: [Content] + + internal var context: EscapeContext /// Create a table foot. /// /// - Parameter content: The foot's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -1885,17 +1915,23 @@ public struct TableRow: ContentNode, TableElement { internal var attributes: OrderedDictionary? - internal var content: [Content] + internal var content: [Content] + + internal var context: EscapeContext /// Create a table row. /// /// - Parameter content: The row's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -2217,17 +2253,23 @@ public struct DataCell: ContentNode, TableElement { internal var attributes: OrderedDictionary? - internal var content: [Content] + internal var content: [Content] + + internal var context: EscapeContext /// Create a data cell. /// /// - Parameter content: The cell's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -2557,17 +2599,23 @@ public struct HeaderCell: ContentNode, TableElement { internal var attributes: OrderedDictionary? - internal var content: [Content] + internal var content: [Content] + + internal var context: EscapeContext /// Create a header cell. /// /// - Parameter content: The cell's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -2885,6 +2933,8 @@ extension HeaderCell: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttribu extension HeaderCell: Localizable { public init(_ localizedKey: LocalizedStringKey, tableName: String? = nil) { + + self.context = .tainted(.html) self.content = [LocalizedString(key: localizedKey, table: tableName)] } } diff --git a/Sources/HTMLKit/Abstraction/Elements/VectorElements.swift b/Sources/HTMLKit/Abstraction/Elements/VectorElements.swift index d4534732..43a7652b 100644 --- a/Sources/HTMLKit/Abstraction/Elements/VectorElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/VectorElements.swift @@ -25,16 +25,22 @@ public struct Circle: ContentNode, VectorElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a circle. /// /// - Parameter content: The circle's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -160,16 +166,22 @@ public struct Rectangle: ContentNode, VectorElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a rectangle. /// /// - Parameter content: The rectangle's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -317,15 +329,21 @@ public struct Ellipse: ContentNode, VectorElement { internal var content: [Content] + internal var context: EscapeContext + /// Create an ellipse. /// /// - Parameter content: The elliipse's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -464,16 +482,22 @@ public struct Line: ContentNode, VectorElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Creates a line. /// /// - Parameter content: The line's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -577,16 +601,22 @@ public struct Polygon: ContentNode, VectorElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a polygon. /// /// - Parameter content: The polygon's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -694,16 +724,22 @@ public struct Polyline: ContentNode, VectorElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a polyline. /// /// - Parameter content: The polyline's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -811,16 +847,22 @@ public struct Path: ContentNode, VectorElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a path. /// /// - Parameter content: The path's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -927,16 +969,22 @@ public struct Group: ContentNode, VectorElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a group. /// /// - Parameter content: The group's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } @@ -1043,16 +1091,22 @@ public struct Use: ContentNode, VectorElement { internal var attributes: OrderedDictionary? internal var content: [Content] + + internal var context: EscapeContext /// Create a use. /// /// - Parameter content: The use's content. public init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - internal init(attributes: OrderedDictionary?, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } diff --git a/Sources/HTMLKit/Framework/Primitives/Attributes/Attribute.swift b/Sources/HTMLKit/Framework/Primitives/Attributes/Attribute.swift index b68ce09b..83dc821c 100644 --- a/Sources/HTMLKit/Framework/Primitives/Attributes/Attribute.swift +++ b/Sources/HTMLKit/Framework/Primitives/Attributes/Attribute.swift @@ -20,12 +20,12 @@ extension Attribute where Self: ContentNode { internal func mutate(key: String, value: Any) -> Self { guard var attributes = self.attributes else { - return .init(attributes: [key: value], content: content) + return .init(attributes: [key: value], context: context, content: content) } attributes[key] = value - return .init(attributes: attributes, content: content) + return .init(attributes: attributes, context: context, content: content) } } @@ -48,11 +48,11 @@ extension Attribute where Self: CustomNode { internal func mutate(key: String, value: Any) -> Self { guard var attributes = self.attributes else { - return .init(name: name, attributes: [key: value], content: content) + return .init(name: name, attributes: [key: value], context: context, content: content) } attributes[key] = value - return .init(name: name, attributes: attributes, content: content) + return .init(name: name, attributes: attributes, context: context, content: content) } } diff --git a/Sources/HTMLKit/Framework/Primitives/Nodes/Nodes.swift b/Sources/HTMLKit/Framework/Primitives/Nodes/Nodes.swift index 006c9504..84a7e832 100644 --- a/Sources/HTMLKit/Framework/Primitives/Nodes/Nodes.swift +++ b/Sources/HTMLKit/Framework/Primitives/Nodes/Nodes.swift @@ -20,12 +20,15 @@ internal protocol ContentNode: Node { /// The content of the node. var content: [Content] { get } + /// The context of the node. + var context: EscapeContext { get } + /// Initiates a node. /// /// - Parameters: /// - attributes: /// - content: - init(attributes: OrderedDictionary?, content: [Content]) + init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) } extension ContentNode { @@ -33,12 +36,12 @@ extension ContentNode { internal func modify(_ element: Self) -> Self { guard var attributes = self.attributes else { - return .init(attributes: element.attributes, content: self.content) + return .init(attributes: element.attributes, context: self.context, content: self.content) } attributes.merge(element.attributes!) { (_, new) in new } - return .init(attributes: attributes, content: self.content) + return .init(attributes: attributes, context: self.context, content: self.content) } } @@ -79,6 +82,9 @@ internal protocol CommentNode: Node { /// The content of the node. var content: String { get } + + /// The context of the node. + var context: EscapeContext { get } } /// The protocol defines the document node. @@ -87,6 +93,9 @@ internal protocol DocumentNode: Node { /// The content of the node. var content: String { get } + + /// The context of the node. + var context: EscapeContext { get } } @_documentation(visibility: internal) @@ -103,12 +112,15 @@ public protocol CustomNode: Node { /// The content of the node. var content: [Content] { get } + /// The context of the node. + var context: EscapeContext { get } + /// Initiates a node. /// /// - Parameters: /// - attributes: /// - content: - init(name: String, attributes: OrderedDictionary?, content: [Content]) + init(name: String, attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) } extension CustomNode { @@ -116,11 +128,11 @@ extension CustomNode { internal func modify(_ element: Self) -> Self { guard var attributes = self.attributes else { - return .init(name: element.name, attributes: element.attributes, content: self.content) + return .init(name: element.name, attributes: element.attributes, context: self.context, content: self.content) } attributes.merge(element.attributes!) { (_, new) in new } - return .init(name: element.name, attributes: attributes, content: self.content) + return .init(name: element.name, attributes: attributes, context: self.context, content: self.content) } } diff --git a/Sources/HTMLKit/Framework/Rendering/Renderer.swift b/Sources/HTMLKit/Framework/Rendering/Renderer.swift index 8d0508f7..c3aee38e 100644 --- a/Sources/HTMLKit/Framework/Rendering/Renderer.swift +++ b/Sources/HTMLKit/Framework/Rendering/Renderer.swift @@ -208,7 +208,7 @@ public struct Renderer { result += ">" if let contents = element.content as? [Content] { - try render(contents: contents, on: &result) + try render(contents: contents, on: &result, within: element.context) } result += "" @@ -708,4 +708,114 @@ public struct Renderer { } } } + + private func render(contents: [Content], on result: inout String, within context: EscapeContext) throws { + + for content in contents { + + switch content { + case let content as [Content]: + try render(contents: content, on: &result, within: context) + + case let view as View: + result += try render(view: view) + + case let element as any ContentNode: + try render(element: element, on: &result) + + case let element as EmptyNode: + try render(element: element, on: &result) + + case let element as DocumentNode: + render(element: element, on: &result) + + case let element as CommentNode: + render(element: element, on: &result) + + case let element as any CustomNode: + try render(element: element, on: &result) + + case let modifier as EnvironmentModifier: + try render(modifier: modifier, on: &result) + + case let value as EnvironmentValue: + result += try render(envelement: value) + + case let statement as Statement: + try render(statement: statement, on: &result) + + case let sequence as Sequence: + try render(loop: sequence, on: &result) + + case let string as LocalizedString: + result += try render(localized: string) + + case let string as MarkdownString: + + if !features.contains(.markdown) { + result += escape(tainted: .init(string.raw, as: .html(.element))) + + } else { + result += try render(markstring: string) + } + + case let string as EnvironmentString: + try render(envstring: string, on: &result) + + case let string as HtmlString: + result += string.value + + case let string as TaintedString: + result += escape(tainted: string) + + case let doubleValue as Double: + result += String(doubleValue) + + case let floatValue as Float: + result += String(floatValue) + + case let intValue as Int: + result += String(intValue) + + case let stringValue as String: + + switch context { + case .trusted: + result += stringValue + + case .tainted(let subcontext): + result += escape(element: stringValue, with: subcontext) + } + + case let date as Date: + + let formatter = DateFormatter() + formatter.timeZone = environment.timeZone ?? TimeZone.current + formatter.dateStyle = .medium + formatter.timeStyle = .short + + result += formatter.string(from: date) + + default: + throw Error.unknownContentType + } + } + } + + private func escape(element string: String, with context: EscapeContext.Subcontext) -> String { + + switch context { + case .html: + return encoder.encode(string, as: .html(.element)) + + case .css: + return encoder.encode(string, as: .css(.element)) + + case .js: + return encoder.encode(string, as: .js(.element)) + + case .url: + return encoder.encode(string, as: .html(.element)) + } + } } diff --git a/Tests/HTMLKitTests/AttributesTests.swift b/Tests/HTMLKitTests/AttributesTests.swift index 56c85a42..82c787fe 100644 --- a/Tests/HTMLKitTests/AttributesTests.swift +++ b/Tests/HTMLKitTests/AttributesTests.swift @@ -24,13 +24,19 @@ final class AttributesTests: XCTestCase { var attributes: OrderedDictionary? var content: [Content] + + var context: EscapeContext init(@ContentBuilder content: () -> [Content]) { + + self.context = .tainted(.html) self.content = content() } - init(attributes: OrderedDictionary?, content: [Content]) { + init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + self.attributes = attributes + self.context = context self.content = content } From 37065ba4a67e415f8bb409e821e4a74d7cf2e49b Mon Sep 17 00:00:00 2001 From: Mattes Mohr Date: Thu, 22 Jan 2026 20:12:33 +0100 Subject: [PATCH 3/5] Make the attributes context aware --- .../Attributes/AriaAttributes.swift | 184 +- .../Attributes/BasicAttributes.swift | 606 +- .../Attributes/VectorAttributes.swift | 100 +- .../Abstraction/Elements/BasicElements.swift | 172 +- .../Abstraction/Elements/BodyElements.swift | 13846 ++++++++++------ .../Elements/DefinitionElements.swift | 364 +- .../Abstraction/Elements/FigureElements.swift | 182 +- .../Abstraction/Elements/FormElements.swift | 1188 +- .../Abstraction/Elements/HeadElements.swift | 782 +- .../Abstraction/Elements/HtmlElements.swift | 328 +- .../Abstraction/Elements/InputElements.swift | 752 +- .../Abstraction/Elements/ListElements.swift | 188 +- .../Abstraction/Elements/MapElements.swift | 208 +- .../Abstraction/Elements/MediaElements.swift | 330 +- .../Abstraction/Elements/ObjectElements.swift | 152 +- .../Abstraction/Elements/RubyElements.swift | 364 +- .../Abstraction/Elements/TableElements.swift | 1597 +- .../Abstraction/Elements/VectorElements.swift | 804 +- .../Primitives/Attributes/Attribute.swift | 19 +- .../Primitives/Attributes/AttributeData.swift | 111 + .../Framework/Primitives/Nodes/Nodes.swift | 12 +- .../Framework/Rendering/Renderer.swift | 104 +- .../HTMLKitComponents/Components/Symbol.swift | 7 +- Tests/HTMLKitTests/AttributesTests.swift | 517 +- 24 files changed, 14731 insertions(+), 8186 deletions(-) create mode 100644 Sources/HTMLKit/Framework/Primitives/Attributes/AttributeData.swift diff --git a/Sources/HTMLKit/Abstraction/Attributes/AriaAttributes.swift b/Sources/HTMLKit/Abstraction/Attributes/AriaAttributes.swift index 4aeab472..d177284f 100644 --- a/Sources/HTMLKit/Abstraction/Attributes/AriaAttributes.swift +++ b/Sources/HTMLKit/Abstraction/Attributes/AriaAttributes.swift @@ -15,14 +15,14 @@ public protocol AriaActiveDescendantAttribute: Attribute { extension AriaActiveDescendantAttribute where Self: ContentNode { - internal func mutate(ariaactivedescendant value: String) -> Self { + internal func mutate(ariaactivedescendant value: AttributeData) -> Self { return self.mutate(key: "aria-activedescendant", value: value) } } extension AriaActiveDescendantAttribute where Self: EmptyNode { - internal func mutate(ariaactivedescendant value: String) -> Self { + internal func mutate(ariaactivedescendant value: AttributeData) -> Self { return self.mutate(key: "aria-activedescendant", value: value) } } @@ -42,14 +42,14 @@ public protocol AriaAtomicAttribute: Attribute { extension AriaAtomicAttribute where Self: ContentNode { - internal func mutate(ariaatomic value: Bool) -> Self { + internal func mutate(ariaatomic value: AttributeData) -> Self { return self.mutate(key: "aria-atomic", value: value) } } extension AriaAtomicAttribute where Self: EmptyNode { - internal func mutate(ariaatomic value: Bool) -> Self { + internal func mutate(ariaatomic value: AttributeData) -> Self { return self.mutate(key: "aria-atomic", value: value) } } @@ -68,14 +68,14 @@ public protocol AriaAutoCompleteAttribute: Attribute { extension AriaAutoCompleteAttribute where Self: ContentNode { - internal func mutate(ariaautocomplete value: String) -> Self { + internal func mutate(ariaautocomplete value: AttributeData) -> Self { return self.mutate(key: "aria-autocomplete", value: value) } } extension AriaAutoCompleteAttribute where Self: EmptyNode { - internal func mutate(ariaautocomplete value: String) -> Self { + internal func mutate(ariaautocomplete value: AttributeData) -> Self { return self.mutate(key: "aria-autocomplete", value: value) } } @@ -94,14 +94,14 @@ public protocol AriaBusyAttribute: Attribute { extension AriaBusyAttribute where Self: ContentNode { - internal func mutate(ariabusy value: Bool) -> Self { + internal func mutate(ariabusy value: AttributeData) -> Self { return self.mutate(key: "aria-busy", value: value) } } extension AriaBusyAttribute where Self: EmptyNode { - internal func mutate(ariabusy value: Bool) -> Self { + internal func mutate(ariabusy value: AttributeData) -> Self { return self.mutate(key: "aria-busy", value: value) } } @@ -120,14 +120,14 @@ public protocol AriaCheckedAttribute: Attribute { extension AriaCheckedAttribute where Self: ContentNode { - internal func mutate(ariachecked value: String) -> Self { + internal func mutate(ariachecked value: AttributeData) -> Self { return self.mutate(key: "aria-checked", value: value) } } extension AriaCheckedAttribute where Self: EmptyNode { - internal func mutate(ariachecked value: String) -> Self { + internal func mutate(ariachecked value: AttributeData) -> Self { return self.mutate(key: "aria-checked", value: value) } } @@ -146,14 +146,14 @@ public protocol AriaColumnCountAttribute: Attribute { extension AriaColumnCountAttribute where Self: ContentNode { - internal func mutate(ariacolcount value: Int) -> Self { + internal func mutate(ariacolcount value: AttributeData) -> Self { return self.mutate(key: "aria-colcount", value: value) } } extension AriaColumnCountAttribute where Self: EmptyNode { - internal func mutate(ariacolcount value: Int) -> Self { + internal func mutate(ariacolcount value: AttributeData) -> Self { return self.mutate(key: "aria-colcount", value: value) } } @@ -172,14 +172,14 @@ public protocol AriaColumnIndexAttribute: Attribute { extension AriaColumnIndexAttribute where Self: ContentNode { - internal func mutate(ariacolindex value: Int) -> Self { + internal func mutate(ariacolindex value: AttributeData) -> Self { return self.mutate(key: "aria-colindex", value: value) } } extension AriaColumnIndexAttribute where Self: EmptyNode { - internal func mutate(ariacolindex value: Int) -> Self { + internal func mutate(ariacolindex value: AttributeData) -> Self { return self.mutate(key: "aria-colindex", value: value) } } @@ -198,14 +198,14 @@ public protocol AriaColumnSpanAttribute: Attribute { extension AriaColumnSpanAttribute where Self: ContentNode { - internal func mutate(ariacolspan value: Int) -> Self { + internal func mutate(ariacolspan value: AttributeData) -> Self { return self.mutate(key: "aria-colspan", value: value) } } extension AriaColumnSpanAttribute where Self: EmptyNode { - internal func mutate(ariacolspan value: Int) -> Self { + internal func mutate(ariacolspan value: AttributeData) -> Self { return self.mutate(key: "aria-colspan", value: value) } } @@ -224,14 +224,14 @@ public protocol AriaControlsAttribute: Attribute { extension AriaControlsAttribute where Self: ContentNode { - internal func mutate(ariacontrols value: String) -> Self { + internal func mutate(ariacontrols value: AttributeData) -> Self { return self.mutate(key: "aria-controls", value: value) } } extension AriaControlsAttribute where Self: EmptyNode { - internal func mutate(ariacontrols value: String) -> Self { + internal func mutate(ariacontrols value: AttributeData) -> Self { return self.mutate(key: "aria-controls", value: value) } } @@ -250,14 +250,14 @@ public protocol AriaCurrentAttribute: Attribute { extension AriaCurrentAttribute where Self: ContentNode { - internal func mutate(ariacurrent value: String) -> Self { + internal func mutate(ariacurrent value: AttributeData) -> Self { return self.mutate(key: "aria-current", value: value) } } extension AriaCurrentAttribute where Self: EmptyNode { - internal func mutate(ariacurrent value: String) -> Self { + internal func mutate(ariacurrent value: AttributeData) -> Self { return self.mutate(key: "aria-current", value: value) } } @@ -276,14 +276,14 @@ public protocol AriaDescribedAttribute: Attribute { extension AriaDescribedAttribute where Self: ContentNode { - internal func mutate(ariadescribedby value: String) -> Self { + internal func mutate(ariadescribedby value: AttributeData) -> Self { return self.mutate(key: "aria-describedby", value: value) } } extension AriaDescribedAttribute where Self: EmptyNode { - internal func mutate(ariadescribedby value: String) -> Self { + internal func mutate(ariadescribedby value: AttributeData) -> Self { return self.mutate(key: "aria-describedby", value: value) } } @@ -302,14 +302,14 @@ public protocol AriaDetailsAttribute: Attribute { extension AriaDetailsAttribute where Self: ContentNode { - internal func mutate(ariadetails value: String) -> Self { + internal func mutate(ariadetails value: AttributeData) -> Self { return self.mutate(key: "aria-details", value: value) } } extension AriaDetailsAttribute where Self: EmptyNode { - internal func mutate(ariadetails value: String) -> Self { + internal func mutate(ariadetails value: AttributeData) -> Self { return self.mutate(key: "aria-details", value: value) } } @@ -328,14 +328,14 @@ public protocol AriaDisabledAttribute: Attribute { extension AriaDisabledAttribute where Self: ContentNode { - internal func mutate(ariadisabled value: Bool) -> Self { + internal func mutate(ariadisabled value: AttributeData) -> Self { return self.mutate(key: "aria-disabled", value: value) } } extension AriaDisabledAttribute where Self: EmptyNode { - internal func mutate(ariadisabled value: Bool) -> Self { + internal func mutate(ariadisabled value: AttributeData) -> Self { return self.mutate(key: "aria-disabled", value: value) } } @@ -354,14 +354,14 @@ public protocol AriaErrorMessageAttribute: Attribute { extension AriaErrorMessageAttribute where Self: ContentNode { - internal func mutate(ariaerrormessage value: String) -> Self { + internal func mutate(ariaerrormessage value: AttributeData) -> Self { return self.mutate(key: "aria-errormessage", value: value) } } extension AriaErrorMessageAttribute where Self: EmptyNode { - internal func mutate(ariaerrormessage value: String) -> Self { + internal func mutate(ariaerrormessage value: AttributeData) -> Self { return self.mutate(key: "aria-errormessage", value: value) } } @@ -380,14 +380,14 @@ public protocol AriaExpandedAttribute: Attribute { extension AriaExpandedAttribute where Self: ContentNode { - internal func mutate(ariaexpanded value: Bool) -> Self { + internal func mutate(ariaexpanded value: AttributeData) -> Self { return self.mutate(key: "aria-expanded", value: value) } } extension AriaExpandedAttribute where Self: EmptyNode { - internal func mutate(ariaexpanded value: Bool) -> Self { + internal func mutate(ariaexpanded value: AttributeData) -> Self { return self.mutate(key: "aria-expanded", value: value) } } @@ -406,14 +406,14 @@ public protocol AriaFlowToAttribute: Attribute { extension AriaFlowToAttribute where Self: ContentNode { - internal func mutate(ariaflowto value: String) -> Self { + internal func mutate(ariaflowto value: AttributeData) -> Self { return self.mutate(key: "aria-flowto", value: value) } } extension AriaFlowToAttribute where Self: EmptyNode { - internal func mutate(ariaflowto value: String) -> Self { + internal func mutate(ariaflowto value: AttributeData) -> Self { return self.mutate(key: "aria-flowto", value: value) } } @@ -432,14 +432,14 @@ public protocol AriaPopupAttribute: Attribute { extension AriaPopupAttribute where Self: ContentNode { - internal func mutate(ariahaspopup value: String) -> Self { + internal func mutate(ariahaspopup value: AttributeData) -> Self { return self.mutate(key: "aria-haspopup", value: value) } } extension AriaPopupAttribute where Self: EmptyNode { - internal func mutate(ariahaspopup value: String) -> Self { + internal func mutate(ariahaspopup value: AttributeData) -> Self { return self.mutate(key: "aria-haspopup", value: value) } } @@ -458,14 +458,14 @@ public protocol AriaHiddenAttribute: Attribute { extension AriaHiddenAttribute where Self: ContentNode { - internal func mutate(ariahidden value: Bool) -> Self { + internal func mutate(ariahidden value: AttributeData) -> Self { return self.mutate(key: "aria-hidden", value: value) } } extension AriaHiddenAttribute where Self: EmptyNode { - internal func mutate(ariahidden value: Bool) -> Self { + internal func mutate(ariahidden value: AttributeData) -> Self { return self.mutate(key: "aria-hidden", value: value) } } @@ -484,14 +484,14 @@ public protocol AriaInvalidAttribute: Attribute { extension AriaInvalidAttribute where Self: ContentNode { - internal func mutate(ariainvalid value: String) -> Self { + internal func mutate(ariainvalid value: AttributeData) -> Self { return self.mutate(key: "aria-invalid", value: value) } } extension AriaInvalidAttribute where Self: EmptyNode { - internal func mutate(ariainvalid value: String) -> Self { + internal func mutate(ariainvalid value: AttributeData) -> Self { return self.mutate(key: "aria-invalid", value: value) } } @@ -510,14 +510,14 @@ public protocol AriaShortcutsAttribute: Attribute { extension AriaShortcutsAttribute where Self: ContentNode { - internal func mutate(ariakeyshortcuts value: String) -> Self { + internal func mutate(ariakeyshortcuts value: AttributeData) -> Self { return self.mutate(key: "aria-keyshortcuts", value: value) } } extension AriaShortcutsAttribute where Self: EmptyNode { - internal func mutate(ariakeyshortcuts value: String) -> Self { + internal func mutate(ariakeyshortcuts value: AttributeData) -> Self { return self.mutate(key: "aria-keyshortcuts", value: value) } } @@ -536,14 +536,14 @@ public protocol AriaLabelAttribute: Attribute { extension AriaLabelAttribute where Self: ContentNode { - internal func mutate(arialabel value: String) -> Self { + internal func mutate(arialabel value: AttributeData) -> Self { return self.mutate(key: "aria-label", value: value) } } extension AriaLabelAttribute where Self: EmptyNode { - internal func mutate(arialabel value: String) -> Self { + internal func mutate(arialabel value: AttributeData) -> Self { return self.mutate(key: "aria-label", value: value) } } @@ -562,14 +562,14 @@ public protocol AriaLabeledAttribute: Attribute { extension AriaLabeledAttribute where Self: ContentNode { - internal func mutate(arialabeledby value: String) -> Self { + internal func mutate(arialabeledby value: AttributeData) -> Self { return self.mutate(key: "aria-labeledby", value: value) } } extension AriaLabeledAttribute where Self: EmptyNode { - internal func mutate(arialabeledby value: String) -> Self { + internal func mutate(arialabeledby value: AttributeData) -> Self { return self.mutate(key: "aria-labeledby", value: value) } } @@ -588,14 +588,14 @@ public protocol AriaLevelAttribute: Attribute { extension AriaLevelAttribute where Self: ContentNode { - internal func mutate(arialevel value: Int) -> Self { + internal func mutate(arialevel value: AttributeData) -> Self { return self.mutate(key: "aria-level", value: value) } } extension AriaLevelAttribute where Self: EmptyNode { - internal func mutate(arialevel value: Int) -> Self { + internal func mutate(arialevel value: AttributeData) -> Self { return self.mutate(key: "aria-level", value: value) } } @@ -614,14 +614,14 @@ public protocol AriaLiveAttribute: Attribute { extension AriaLiveAttribute where Self: ContentNode { - internal func mutate(arialive value: String) -> Self { + internal func mutate(arialive value: AttributeData) -> Self { return self.mutate(key: "aria-live", value: value) } } extension AriaLiveAttribute where Self: EmptyNode { - internal func mutate(arialive value: String) -> Self { + internal func mutate(arialive value: AttributeData) -> Self { return self.mutate(key: "aria-live", value: value) } } @@ -640,14 +640,14 @@ public protocol AriaModalAttribute: Attribute { extension AriaModalAttribute where Self: ContentNode { - internal func mutate(ariamodal value: Bool) -> Self { + internal func mutate(ariamodal value: AttributeData) -> Self { return self.mutate(key: "aria-modal", value: value) } } extension AriaModalAttribute where Self: EmptyNode { - internal func mutate(ariamodal value: Bool) -> Self { + internal func mutate(ariamodal value: AttributeData) -> Self { return self.mutate(key: "aria-modal", value: value) } } @@ -666,14 +666,14 @@ public protocol AriaMultilineAttribute: Attribute { extension AriaMultilineAttribute where Self: ContentNode { - internal func mutate(ariamultiline value: Bool) -> Self { + internal func mutate(ariamultiline value: AttributeData) -> Self { return self.mutate(key: "aria-multiline", value: value) } } extension AriaMultilineAttribute where Self: EmptyNode { - internal func mutate(ariamultiline value: Bool) -> Self { + internal func mutate(ariamultiline value: AttributeData) -> Self { return self.mutate(key: "aria-multiline", value: value) } } @@ -692,14 +692,14 @@ public protocol AriaMultiselectAttribute: Attribute { extension AriaMultiselectAttribute where Self: ContentNode { - internal func mutate(ariamultiselectable value: Bool) -> Self { + internal func mutate(ariamultiselectable value: AttributeData) -> Self { return self.mutate(key: "aria-multiselectable", value: value) } } extension AriaMultiselectAttribute where Self: EmptyNode { - internal func mutate(ariamultiselectable value: Bool) -> Self { + internal func mutate(ariamultiselectable value: AttributeData) -> Self { return self.mutate(key: "aria-multiselectable", value: value) } } @@ -718,14 +718,14 @@ public protocol AriaOrientationAttribute: Attribute { extension AriaOrientationAttribute where Self: ContentNode { - internal func mutate(ariaorientation value: String) -> Self { + internal func mutate(ariaorientation value: AttributeData) -> Self { return self.mutate(key: "aria-orientation", value: value) } } extension AriaOrientationAttribute where Self: EmptyNode { - internal func mutate(ariaorientation value: String) -> Self { + internal func mutate(ariaorientation value: AttributeData) -> Self { return self.mutate(key: "aria-orientation", value: value) } } @@ -744,14 +744,14 @@ public protocol AriaOwnsAttribute: Attribute { extension AriaOwnsAttribute where Self: ContentNode { - internal func mutate(ariaowns value: String) -> Self { + internal func mutate(ariaowns value: AttributeData) -> Self { return self.mutate(key: "aria-owns", value: value) } } extension AriaOwnsAttribute where Self: EmptyNode { - internal func mutate(ariaowns value: String) -> Self { + internal func mutate(ariaowns value: AttributeData) -> Self { return self.mutate(key: "aria-owns", value: value) } } @@ -770,14 +770,14 @@ public protocol AriaPlaceholderAttribute: Attribute { extension AriaPlaceholderAttribute where Self: ContentNode { - internal func mutate(ariaplaceholder value: String) -> Self { + internal func mutate(ariaplaceholder value: AttributeData) -> Self { return self.mutate(key: "aria-placeholder", value: value) } } extension AriaPlaceholderAttribute where Self: EmptyNode { - internal func mutate(ariaplaceholder value: String) -> Self { + internal func mutate(ariaplaceholder value: AttributeData) -> Self { return self.mutate(key: "aria-placeholder", value: value) } } @@ -796,14 +796,14 @@ public protocol AriaPositionInsetAttribute: Attribute { extension AriaPositionInsetAttribute where Self: ContentNode { - internal func mutate(ariaposinset value: Int) -> Self { + internal func mutate(ariaposinset value: AttributeData) -> Self { return self.mutate(key: "aria-posinset", value: value) } } extension AriaPositionInsetAttribute where Self: EmptyNode { - internal func mutate(ariaposinset value: Int) -> Self { + internal func mutate(ariaposinset value: AttributeData) -> Self { return self.mutate(key: "aria-posinset", value: value) } } @@ -822,14 +822,14 @@ public protocol AriaPressedAttribute: Attribute { extension AriaPressedAttribute where Self: ContentNode { - internal func mutate(ariapressed value: String) -> Self { + internal func mutate(ariapressed value: AttributeData) -> Self { return self.mutate(key: "aria-pressed", value: value) } } extension AriaPressedAttribute where Self: EmptyNode { - internal func mutate(ariapressed value: String) -> Self { + internal func mutate(ariapressed value: AttributeData) -> Self { return self.mutate(key: "aria-pressed", value: value) } } @@ -848,14 +848,14 @@ public protocol AriaReadonlyAttribute: Attribute { extension AriaReadonlyAttribute where Self: ContentNode { - internal func mutate(ariareadonly value: Bool) -> Self { + internal func mutate(ariareadonly value: AttributeData) -> Self { return self.mutate(key: "aria-readonly", value: value) } } extension AriaReadonlyAttribute where Self: EmptyNode { - internal func mutate(ariareadonly value: Bool) -> Self { + internal func mutate(ariareadonly value: AttributeData) -> Self { return self.mutate(key: "aria-readonly", value: value) } } @@ -874,14 +874,14 @@ public protocol AriaRelevantAttribute: Attribute { extension AriaRelevantAttribute where Self: ContentNode { - internal func mutate(ariarelevant value: String) -> Self { + internal func mutate(ariarelevant value: AttributeData) -> Self { return self.mutate(key: "aria-relevant", value: value) } } extension AriaRelevantAttribute where Self: EmptyNode { - internal func mutate(ariarelevant value: String) -> Self { + internal func mutate(ariarelevant value: AttributeData) -> Self { return self.mutate(key: "aria-relevant", value: value) } } @@ -900,14 +900,14 @@ public protocol AriaRequiredAttribute: Attribute { extension AriaRequiredAttribute where Self: ContentNode { - internal func mutate(ariarequired value: Bool) -> Self { + internal func mutate(ariarequired value: AttributeData) -> Self { return self.mutate(key: "aria-required", value: value) } } extension AriaRequiredAttribute where Self: EmptyNode { - internal func mutate(ariarequired value: Bool) -> Self { + internal func mutate(ariarequired value: AttributeData) -> Self { return self.mutate(key: "aria-required", value: value) } } @@ -926,14 +926,14 @@ public protocol AriaRoleDescriptionAttribute: Attribute { extension AriaRoleDescriptionAttribute where Self: ContentNode { - internal func mutate(ariaroledescription value: String) -> Self { + internal func mutate(ariaroledescription value: AttributeData) -> Self { return self.mutate(key: "aria-roledescription", value: value) } } extension AriaRoleDescriptionAttribute where Self: EmptyNode { - internal func mutate(ariaroledescription value: String) -> Self { + internal func mutate(ariaroledescription value: AttributeData) -> Self { return self.mutate(key: "aria-roledescription", value: value) } } @@ -952,14 +952,14 @@ public protocol AriaRowCountAttribute: Attribute { extension AriaRowCountAttribute where Self: ContentNode { - internal func mutate(ariarowcount value: Int) -> Self { + internal func mutate(ariarowcount value: AttributeData) -> Self { return self.mutate(key: "aria-rowcount", value: value) } } extension AriaRowCountAttribute where Self: EmptyNode { - internal func mutate(ariarowcount value: Int) -> Self { + internal func mutate(ariarowcount value: AttributeData) -> Self { return self.mutate(key: "aria-rowcount", value: value) } } @@ -978,14 +978,14 @@ public protocol AriaRowIndexAttribute: Attribute { extension AriaRowIndexAttribute where Self: ContentNode { - internal func mutate(ariarowindex value: Int) -> Self { + internal func mutate(ariarowindex value: AttributeData) -> Self { return self.mutate(key: "aria-rowindex", value: value) } } extension AriaRowIndexAttribute where Self: EmptyNode { - internal func mutate(ariarowindex value: Int) -> Self { + internal func mutate(ariarowindex value: AttributeData) -> Self { return self.mutate(key: "aria-rowindex", value: value) } } @@ -1004,14 +1004,14 @@ public protocol AriaRowSpanAttribute: Attribute { extension AriaRowSpanAttribute where Self: ContentNode { - internal func mutate(ariarowspan value: Int) -> Self { + internal func mutate(ariarowspan value: AttributeData) -> Self { return self.mutate(key: "aria-rowspan", value: value) } } extension AriaRowSpanAttribute where Self: EmptyNode { - internal func mutate(ariarowspan value: Int) -> Self { + internal func mutate(ariarowspan value: AttributeData) -> Self { return self.mutate(key: "aria-rowspan", value: value) } } @@ -1030,14 +1030,14 @@ public protocol AriaSelectedAttribute: Attribute { extension AriaSelectedAttribute where Self: ContentNode { - internal func mutate(ariaselected value: String) -> Self { + internal func mutate(ariaselected value: AttributeData) -> Self { return self.mutate(key: "aria-selected", value: value) } } extension AriaSelectedAttribute where Self: EmptyNode { - internal func mutate(ariaselected value: String) -> Self { + internal func mutate(ariaselected value: AttributeData) -> Self { return self.mutate(key: "aria-selected", value: value) } } @@ -1056,14 +1056,14 @@ public protocol AriaSetSizeAttribute: Attribute { extension AriaSetSizeAttribute where Self: ContentNode { - internal func mutate(ariasetsize value: Int) -> Self { + internal func mutate(ariasetsize value: AttributeData) -> Self { return self.mutate(key: "aria-setsize", value: value) } } extension AriaSetSizeAttribute where Self: EmptyNode { - internal func mutate(ariasetsize value: Int) -> Self { + internal func mutate(ariasetsize value: AttributeData) -> Self { return self.mutate(key: "aria-setsize", value: value) } } @@ -1082,14 +1082,14 @@ public protocol AriaSortAttribute: Attribute { extension AriaSortAttribute where Self: ContentNode { - internal func mutate(ariasort value: String) -> Self { + internal func mutate(ariasort value: AttributeData) -> Self { return self.mutate(key: "aria-sort", value: value) } } extension AriaSortAttribute where Self: EmptyNode { - internal func mutate(ariasort value: String) -> Self { + internal func mutate(ariasort value: AttributeData) -> Self { return self.mutate(key: "aria-sort", value: value) } } @@ -1108,14 +1108,14 @@ public protocol AriaValueMaximumAttribute: Attribute { extension AriaValueMaximumAttribute where Self: ContentNode { - internal func mutate(ariavaluemax value: Float) -> Self { + internal func mutate(ariavaluemax value: AttributeData) -> Self { return self.mutate(key: "aria-valuemax", value: value) } } extension AriaValueMaximumAttribute where Self: EmptyNode { - internal func mutate(ariavaluemax value: Float) -> Self { + internal func mutate(ariavaluemax value: AttributeData) -> Self { return self.mutate(key: "aria-valuemax", value: value) } } @@ -1134,14 +1134,14 @@ public protocol AriaValueMininumAttribute: Attribute { extension AriaValueMininumAttribute where Self: ContentNode { - internal func mutate(ariavaluemin value: Float) -> Self { + internal func mutate(ariavaluemin value: AttributeData) -> Self { return self.mutate(key: "aria-valuemin", value: value) } } extension AriaValueMininumAttribute where Self: EmptyNode { - internal func mutate(ariavaluemin value: Float) -> Self { + internal func mutate(ariavaluemin value: AttributeData) -> Self { return self.mutate(key: "aria-valuemin", value: value) } } @@ -1160,14 +1160,14 @@ public protocol AriaValueNowAttribute: Attribute { extension AriaValueNowAttribute where Self: ContentNode { - internal func mutate(ariavaluenow value: Float) -> Self { + internal func mutate(ariavaluenow value: AttributeData) -> Self { return self.mutate(key: "aria-valuenow", value: value) } } extension AriaValueNowAttribute where Self: EmptyNode { - internal func mutate(ariavaluenow value: Float) -> Self { + internal func mutate(ariavaluenow value: AttributeData) -> Self { return self.mutate(key: "aria-valuenow", value: value) } } @@ -1186,14 +1186,14 @@ public protocol AriaValueTextAttribute: Attribute { extension AriaValueTextAttribute where Self: ContentNode { - internal func mutate(ariavaluetext value: String) -> Self { + internal func mutate(ariavaluetext value: AttributeData) -> Self { return self.mutate(key: "aria-valuetext", value: value) } } extension AriaValueTextAttribute where Self: EmptyNode { - internal func mutate(ariavaluetext value: String) -> Self { + internal func mutate(ariavaluetext value: AttributeData) -> Self { return self.mutate(key: "aria-valuetext", value: value) } } diff --git a/Sources/HTMLKit/Abstraction/Attributes/BasicAttributes.swift b/Sources/HTMLKit/Abstraction/Attributes/BasicAttributes.swift index f4b61eae..acb59338 100644 --- a/Sources/HTMLKit/Abstraction/Attributes/BasicAttributes.swift +++ b/Sources/HTMLKit/Abstraction/Attributes/BasicAttributes.swift @@ -26,14 +26,14 @@ public protocol AccessKeyAttribute: Attribute { extension AccessKeyAttribute where Self: ContentNode { - internal func mutate(accesskey value: Character) -> Self { + internal func mutate(accesskey value: AttributeData) -> Self { return self.mutate(key: "accesskey", value: value) } } extension AccessKeyAttribute where Self: EmptyNode { - internal func mutate(accesskey value: Character) -> Self { + internal func mutate(accesskey value: AttributeData) -> Self { return self.mutate(key: "accesskey", value: value) } } @@ -97,14 +97,14 @@ public protocol AcceptAttribute: Attribute { extension AcceptAttribute where Self: ContentNode { - internal func mutate(accept value: String) -> Self { + internal func mutate(accept value: AttributeData) -> Self { return self.mutate(key: "accept", value: value) } } extension AcceptAttribute where Self: EmptyNode { - internal func mutate(accept value: String) -> Self { + internal func mutate(accept value: AttributeData) -> Self { return self.mutate(key: "accept", value: value) } } @@ -140,14 +140,14 @@ public protocol ActionAttribute: Attribute { extension ActionAttribute where Self: ContentNode { - internal func mutate(action value: String) -> Self { + internal func mutate(action value: AttributeData) -> Self { return self.mutate(key: "action", value: value) } } extension ActionAttribute where Self: EmptyNode { - internal func mutate(action value: String) -> Self { + internal func mutate(action value: AttributeData) -> Self { return self.mutate(key: "action", value: value) } } @@ -197,22 +197,14 @@ public protocol AlternateAttribute: Attribute { extension AlternateAttribute where Self: ContentNode { - internal func mutate(alternate value: String) -> Self { - return self.mutate(key: "alt", value: value) - } - - internal func mutate(alternate value: LocalizedString) -> Self { + internal func mutate(alternate value: AttributeData) -> Self { return self.mutate(key: "alt", value: value) } } extension AlternateAttribute where Self: EmptyNode { - internal func mutate(alternate value: String) -> Self { - return self.mutate(key: "alt", value: value) - } - - internal func mutate(alternate value: LocalizedString) -> Self { + internal func mutate(alternate value: AttributeData) -> Self { return self.mutate(key: "alt", value: value) } } @@ -238,14 +230,14 @@ public protocol AsAttribute: Attribute { extension AsAttribute where Self: ContentNode { - internal func mutate(as value: String) -> Self { + internal func mutate(as value: AttributeData) -> Self { return self.mutate(key: "as", value: value) } } extension AsAttribute where Self: EmptyNode { - internal func mutate(as value: String) -> Self { + internal func mutate(as value: AttributeData) -> Self { return self.mutate(key: "as", value: value) } } @@ -269,14 +261,14 @@ public protocol AsynchronouslyAttribute: Attribute { extension AsynchronouslyAttribute where Self: ContentNode { - internal func mutate(async value: String) -> Self { + internal func mutate(async value: AttributeData) -> Self { return self.mutate(key: "async", value: value) } } extension AsynchronouslyAttribute where Self: EmptyNode { - internal func mutate(async value: String) -> Self { + internal func mutate(async value: AttributeData) -> Self { return self.mutate(key: "async", value: value) } } @@ -300,14 +292,14 @@ public protocol AutocapitalizeAttribute: Attribute { extension AutocapitalizeAttribute where Self: ContentNode { - internal func mutate(autocapitalize value: String) -> Self { + internal func mutate(autocapitalize value: AttributeData) -> Self { return self.mutate(key: "autocapitalize", value: value) } } extension AutocapitalizeAttribute where Self: EmptyNode { - internal func mutate(autocapitalize value: String) -> Self { + internal func mutate(autocapitalize value: AttributeData) -> Self { return self.mutate(key: "autocapitalize", value: value) } } @@ -343,14 +335,14 @@ public protocol AutocompleteAttribute: Attribute { extension AutocompleteAttribute where Self: ContentNode { - internal func mutate(autocomplete value: String) -> Self { + internal func mutate(autocomplete value: AttributeData) -> Self { return self.mutate(key: "autocomplete", value: value) } } extension AutocompleteAttribute where Self: EmptyNode { - internal func mutate(autocomplete value: String) -> Self { + internal func mutate(autocomplete value: AttributeData) -> Self { return self.mutate(key: "autocomplete", value: value) } } @@ -372,14 +364,14 @@ public protocol AutofocusAttribute: Attribute { extension AutofocusAttribute where Self: ContentNode { - internal func mutate(autofocus value: String) -> Self { + internal func mutate(autofocus value: AttributeData) -> Self { return self.mutate(key: "autofocus", value: value) } } extension AutofocusAttribute where Self: EmptyNode { - internal func mutate(autofocus value: String) -> Self { + internal func mutate(autofocus value: AttributeData) -> Self { return self.mutate(key: "autofocus", value: value) } } @@ -405,14 +397,14 @@ public protocol AutoplayAttribute: Attribute { extension AutoplayAttribute where Self: ContentNode { - internal func mutate(autoplay value: String) -> Self { + internal func mutate(autoplay value: AttributeData) -> Self { return self.mutate(key: "autoplay", value: value) } } extension AutoplayAttribute where Self: EmptyNode { - internal func mutate(autoplay value: String) -> Self { + internal func mutate(autoplay value: AttributeData) -> Self { return self.mutate(key: "autoplay", value: value) } } @@ -436,14 +428,14 @@ public protocol CharsetAttribute: Attribute { extension CharsetAttribute where Self: ContentNode { - internal func mutate(charset value: String) -> Self { + internal func mutate(charset value: AttributeData) -> Self { return self.mutate(key: "charset", value: value) } } extension CharsetAttribute where Self: EmptyNode { - internal func mutate(charset value: String) -> Self { + internal func mutate(charset value: AttributeData) -> Self { return self.mutate(key: "charset", value: value) } } @@ -468,14 +460,14 @@ public protocol CheckedAttribute: Attribute { extension CheckedAttribute where Self: ContentNode { - internal func mutate(checked value: String) -> Self { + internal func mutate(checked value: AttributeData) -> Self { return self.mutate(key: "checked", value: value) } } extension CheckedAttribute where Self: EmptyNode { - internal func mutate(checked value: String) -> Self { + internal func mutate(checked value: AttributeData) -> Self { return self.mutate(key: "checked", value: value) } } @@ -501,14 +493,14 @@ public protocol CiteAttribute: Attribute { extension CiteAttribute where Self: ContentNode { - internal func mutate(cite value: String) -> Self { + internal func mutate(cite value: AttributeData) -> Self { return self.mutate(key: "cite", value: value) } } extension CiteAttribute where Self: EmptyNode { - internal func mutate(cite value: String) -> Self { + internal func mutate(cite value: AttributeData) -> Self { return self.mutate(key: "cite", value: value) } } @@ -534,14 +526,14 @@ public protocol ClassAttribute: Attribute{ extension ClassAttribute where Self: ContentNode { - internal func mutate(class value: String) -> Self { + internal func mutate(class value: AttributeData) -> Self { return self.mutate(key: "class", value: value) } } extension ClassAttribute where Self: EmptyNode { - internal func mutate(class value: String) -> Self { + internal func mutate(class value: AttributeData) -> Self { return self.mutate(key: "class", value: value) } } @@ -567,14 +559,14 @@ public protocol ColumnsAttribute: Attribute { extension ColumnsAttribute where Self: ContentNode { - internal func mutate(cols value: Int) -> Self { + internal func mutate(cols value: AttributeData) -> Self { return self.mutate(key: "cols", value: value) } } extension ColumnsAttribute where Self: EmptyNode { - internal func mutate(cols value: Int) -> Self { + internal func mutate(cols value: AttributeData) -> Self { return self.mutate(key: "cols", value: value) } } @@ -601,14 +593,14 @@ public protocol ColumnSpanAttribute: Attribute { extension ColumnSpanAttribute where Self: ContentNode { - internal func mutate(colspan value: Int) -> Self { + internal func mutate(colspan value: AttributeData) -> Self { return self.mutate(key: "colspan", value: value) } } extension ColumnSpanAttribute where Self: EmptyNode { - internal func mutate(colspan value: Int) -> Self { + internal func mutate(colspan value: AttributeData) -> Self { return self.mutate(key: "colspan", value: value) } } @@ -660,22 +652,14 @@ public protocol ContentAttribute: Attribute { extension ContentAttribute where Self: ContentNode { - internal func mutate(content value: String) -> Self { - return self.mutate(key: "content", value: value) - } - - internal func mutate(content value: LocalizedString) -> Self { + internal func mutate(content value: AttributeData) -> Self { return self.mutate(key: "content", value: value) } } extension ContentAttribute where Self: EmptyNode { - internal func mutate(content value: String) -> Self { - return self.mutate(key: "content", value: value) - } - - internal func mutate(content value: LocalizedString) -> Self { + internal func mutate(content value: AttributeData) -> Self { return self.mutate(key: "content", value: value) } } @@ -701,14 +685,14 @@ public protocol EditAttribute: Attribute { extension EditAttribute where Self: ContentNode { - internal func mutate(contenteditable value: Bool) -> Self { + internal func mutate(contenteditable value: AttributeData) -> Self { return self.mutate(key: "contenteditable", value: value) } } extension EditAttribute where Self: EmptyNode { - internal func mutate(contenteditable value: Bool) -> Self { + internal func mutate(contenteditable value: AttributeData) -> Self { return self.mutate(key: "contenteditable", value: value) } } @@ -732,14 +716,14 @@ public protocol ControlsAttribute: Attribute { extension ControlsAttribute where Self: ContentNode { - internal func mutate(controls value: String) -> Self { + internal func mutate(controls value: AttributeData) -> Self { return self.mutate(key: "controls", value: value) } } extension ControlsAttribute where Self: EmptyNode { - internal func mutate(controls value: String) -> Self { + internal func mutate(controls value: AttributeData) -> Self { return self.mutate(key: "controls", value: value) } } @@ -764,14 +748,14 @@ public protocol CoordinatesAttribute: Attribute { extension CoordinatesAttribute where Self: ContentNode { - internal func mutate(coords value: String) -> Self { + internal func mutate(coords value: AttributeData) -> Self { return self.mutate(key: "coords", value: value) } } extension CoordinatesAttribute where Self: EmptyNode { - internal func mutate(coords value: String) -> Self { + internal func mutate(coords value: AttributeData) -> Self { return self.mutate(key: "coords", value: value) } } @@ -796,14 +780,14 @@ public protocol CrossOriginAttribute: Attribute { extension CrossOriginAttribute where Self: ContentNode { - internal func mutate(crossorigin value: String) -> Self { + internal func mutate(crossorigin value: AttributeData) -> Self { return self.mutate(key: "crossorigin", value: value) } } extension CrossOriginAttribute where Self: EmptyNode { - internal func mutate(crossorigin value: String) -> Self { + internal func mutate(crossorigin value: AttributeData) -> Self { return self.mutate(key: "crossorigin", value: value) } } @@ -828,14 +812,14 @@ public protocol DataAttribute: Attribute{ extension DataAttribute where Self: ContentNode { - internal func mutate(data value: String) -> Self { + internal func mutate(data value: AttributeData) -> Self { return self.mutate(key: "data", value: value) } } extension DataAttribute where Self: EmptyNode { - internal func mutate(data value: String) -> Self { + internal func mutate(data value: AttributeData) -> Self { return self.mutate(key: "data", value: value) } } @@ -861,14 +845,14 @@ public protocol DateTimeAttribute: Attribute { extension DateTimeAttribute where Self: ContentNode { - internal func mutate(datetime value: String) -> Self { + internal func mutate(datetime value: AttributeData) -> Self { return self.mutate(key: "datetime", value: value) } } extension DateTimeAttribute where Self: EmptyNode { - internal func mutate(datetime value: String) -> Self { + internal func mutate(datetime value: AttributeData) -> Self { return self.mutate(key: "datetime", value: value) } } @@ -890,14 +874,14 @@ public protocol DefaultAttribute: Attribute { extension DefaultAttribute where Self: ContentNode { - internal func mutate(default value: String) -> Self { + internal func mutate(default value: AttributeData) -> Self { return self.mutate(key: "default", value: value) } } extension DefaultAttribute where Self: EmptyNode { - internal func mutate(default value: String) -> Self { + internal func mutate(default value: AttributeData) -> Self { return self.mutate(key: "default", value: value) } } @@ -921,14 +905,14 @@ public protocol DeferAttribute: Attribute { extension DeferAttribute where Self: ContentNode { - internal func mutate(defer value: String) -> Self { + internal func mutate(defer value: AttributeData) -> Self { return self.mutate(key: "defer", value: value) } } extension DeferAttribute where Self: EmptyNode { - internal func mutate(defer value: String) -> Self { + internal func mutate(defer value: AttributeData) -> Self { return self.mutate(key: "defer", value: value) } } @@ -954,14 +938,14 @@ public protocol DirectionAttribute: Attribute { extension DirectionAttribute where Self: ContentNode { - internal func mutate(dir value: String) -> Self { + internal func mutate(dir value: AttributeData) -> Self { return self.mutate(key: "dir", value: value) } } extension DirectionAttribute where Self: EmptyNode { - internal func mutate(dir value: String) -> Self { + internal func mutate(dir value: AttributeData) -> Self { return self.mutate(key: "dir", value: value) } } @@ -985,14 +969,14 @@ public protocol DisabledAttribute: Attribute { extension DisabledAttribute where Self: ContentNode { - internal func mutate(disabled value: String) -> Self { + internal func mutate(disabled value: AttributeData) -> Self { return self.mutate(key: "disabled", value: value) } } extension DisabledAttribute where Self: EmptyNode { - internal func mutate(disabled value: String) -> Self { + internal func mutate(disabled value: AttributeData) -> Self { return self.mutate(key: "disabled", value: value) } } @@ -1016,14 +1000,14 @@ public protocol DownloadAttribute: Attribute { extension DownloadAttribute where Self: ContentNode { - internal func mutate(download value: String) -> Self { + internal func mutate(download value: AttributeData) -> Self { return self.mutate(key: "download", value: value) } } extension DownloadAttribute where Self: EmptyNode { - internal func mutate(download value: String) -> Self { + internal func mutate(download value: AttributeData) -> Self { return self.mutate(key: "download", value: value) } } @@ -1049,14 +1033,14 @@ public protocol DragAttribute: Attribute { extension DragAttribute where Self: ContentNode { - internal func mutate(draggable value: Bool) -> Self { + internal func mutate(draggable value: AttributeData) -> Self { return self.mutate(key: "draggable", value: value) } } extension DragAttribute where Self: EmptyNode { - internal func mutate(draggable value: Bool) -> Self { + internal func mutate(draggable value: AttributeData) -> Self { return self.mutate(key: "draggable", value: value) } } @@ -1081,14 +1065,14 @@ public protocol EncodingAttribute: Attribute { extension EncodingAttribute where Self: ContentNode { - internal func mutate(enctype value: String) -> Self { + internal func mutate(enctype value: AttributeData) -> Self { return self.mutate(key: "enctype", value: value) } } extension EncodingAttribute where Self: EmptyNode { - internal func mutate(enctype value: String) -> Self { + internal func mutate(enctype value: AttributeData) -> Self { return self.mutate(key: "enctype", value: value) } } @@ -1113,14 +1097,14 @@ public protocol EnterKeyAttribute: Attribute { extension EnterKeyAttribute where Self: ContentNode { - internal func mutate(enterkeyhint value: String) -> Self { + internal func mutate(enterkeyhint value: AttributeData) -> Self { return self.mutate(key: "enterkeyhint", value: value) } } extension EnterKeyAttribute where Self: EmptyNode { - internal func mutate(enterkeyhint value: String) -> Self { + internal func mutate(enterkeyhint value: AttributeData) -> Self { return self.mutate(key: "enterkeyhint", value: value) } } @@ -1146,14 +1130,14 @@ public protocol ForAttribute: Attribute { extension ForAttribute where Self: ContentNode { - internal func mutate(for value: String) -> Self { + internal func mutate(for value: AttributeData) -> Self { return self.mutate(key: "for", value: value) } } extension ForAttribute where Self: EmptyNode { - internal func mutate(for value: String) -> Self { + internal func mutate(for value: AttributeData) -> Self { return self.mutate(key: "for", value: value) } } @@ -1179,14 +1163,14 @@ public protocol FormAttribute: Attribute { extension FormAttribute where Self: ContentNode { - internal func mutate(form value: String) -> Self { + internal func mutate(form value: AttributeData) -> Self { return self.mutate(key: "form", value: value) } } extension FormAttribute where Self: EmptyNode { - internal func mutate(form value: String) -> Self { + internal func mutate(form value: AttributeData) -> Self { return self.mutate(key: "form", value: value) } } @@ -1216,14 +1200,14 @@ public protocol FormActionAttribute: Attribute { extension FormActionAttribute where Self: ContentNode { - internal func mutate(formaction value: String) -> Self { + internal func mutate(formaction value: AttributeData) -> Self { return self.mutate(key: "formaction", value: value) } } extension FormActionAttribute where Self: EmptyNode { - internal func mutate(formaction value: String) -> Self { + internal func mutate(formaction value: AttributeData) -> Self { return self.mutate(key: "formaction", value: value) } } @@ -1247,14 +1231,14 @@ public protocol EquivalentAttribute: Attribute { extension EquivalentAttribute where Self: ContentNode { - internal func mutate(httpequiv value: String) -> Self { + internal func mutate(httpequiv value: AttributeData) -> Self { return self.mutate(key: "http-equiv", value: value) } } extension EquivalentAttribute where Self: EmptyNode { - internal func mutate(httpequiv value: String) -> Self { + internal func mutate(httpequiv value: AttributeData) -> Self { return self.mutate(key: "http-equiv", value: value) } } @@ -1294,14 +1278,14 @@ public protocol HeadersAttribute: Attribute { extension HeadersAttribute where Self: ContentNode { - internal func mutate(headers value: String) -> Self { + internal func mutate(headers value: AttributeData) -> Self { return self.mutate(key: "headers", value: value) } } extension HeadersAttribute where Self: EmptyNode { - internal func mutate(headers value: String) -> Self { + internal func mutate(headers value: AttributeData) -> Self { return self.mutate(key: "headers", value: value) } } @@ -1325,14 +1309,14 @@ public protocol HeightAttribute: Attribute { extension HeightAttribute where Self: ContentNode { - internal func mutate(height value: Int) -> Self { + internal func mutate(height value: AttributeData) -> Self { return self.mutate(key: "height", value: value) } } extension HeightAttribute where Self: EmptyNode { - internal func mutate(height value: Int) -> Self { + internal func mutate(height value: AttributeData) -> Self { return self.mutate(key: "height", value: value) } } @@ -1358,14 +1342,14 @@ public protocol HiddenAttribute: Attribute { extension HiddenAttribute where Self: ContentNode { - internal func mutate(hidden value: String) -> Self { + internal func mutate(hidden value: AttributeData) -> Self { return self.mutate(key: "hidden", value: value) } } extension HiddenAttribute where Self: EmptyNode { - internal func mutate(hidden value: String) -> Self { + internal func mutate(hidden value: AttributeData) -> Self { return self.mutate(key: "hidden", value: value) } } @@ -1390,14 +1374,14 @@ public protocol HighAttribute: Attribute { extension HighAttribute where Self: ContentNode { - internal func mutate(high value: Float) -> Self { + internal func mutate(high value: AttributeData) -> Self { return self.mutate(key: "high", value: value) } } extension HighAttribute where Self: EmptyNode { - internal func mutate(high value: Float) -> Self { + internal func mutate(high value: AttributeData) -> Self { return self.mutate(key: "high", value: value) } } @@ -1423,14 +1407,14 @@ public protocol ReferenceAttribute: Attribute { extension ReferenceAttribute where Self: ContentNode { - internal func mutate(href value: String) -> Self { + internal func mutate(href value: AttributeData) -> Self { return self.mutate(key: "href", value: value) } } extension ReferenceAttribute where Self: EmptyNode { - internal func mutate(href value: String) -> Self { + internal func mutate(href value: AttributeData) -> Self { return self.mutate(key: "href", value: value) } } @@ -1456,14 +1440,14 @@ public protocol ReferenceLanguageAttribute: Attribute { extension ReferenceLanguageAttribute where Self: ContentNode { - internal func mutate(hreflang value: String) -> Self { + internal func mutate(hreflang value: AttributeData) -> Self { return self.mutate(key: "hreflang", value: value) } } extension ReferenceLanguageAttribute where Self: EmptyNode { - internal func mutate(hreflang value: String) -> Self { + internal func mutate(hreflang value: AttributeData) -> Self { return self.mutate(key: "hreflang", value: value) } } @@ -1488,14 +1472,14 @@ public protocol IdentifierAttribute: Attribute { extension IdentifierAttribute where Self: ContentNode { - internal func mutate(id value: String) -> Self { + internal func mutate(id value: AttributeData) -> Self { return self.mutate(key: "id", value: value) } } extension IdentifierAttribute where Self: EmptyNode { - internal func mutate(id value: String) -> Self { + internal func mutate(id value: AttributeData) -> Self { return self.mutate(key: "id", value: value) } } @@ -1522,14 +1506,14 @@ public protocol IsMapAttribute: Attribute { extension IsMapAttribute where Self: ContentNode { - internal func mutate(ismap value: String) -> Self { + internal func mutate(ismap value: AttributeData) -> Self { return self.mutate(key: "ismap", value: value) } } extension IsMapAttribute where Self: EmptyNode { - internal func mutate(ismap value: String) -> Self { + internal func mutate(ismap value: AttributeData) -> Self { return self.mutate(key: "ismap", value: value) } } @@ -1551,14 +1535,14 @@ public protocol InputModeAttribute: Attribute { extension InputModeAttribute where Self: ContentNode { - internal func mutate(inputmode value: String) -> Self { + internal func mutate(inputmode value: AttributeData) -> Self { return self.mutate(key: "inputmode", value: value) } } extension InputModeAttribute where Self: EmptyNode { - internal func mutate(inputmode value: String) -> Self { + internal func mutate(inputmode value: AttributeData) -> Self { return self.mutate(key: "inputmode", value: value) } } @@ -1596,14 +1580,14 @@ public protocol IntegrityAttribute: Attribute { extension IntegrityAttribute where Self: ContentNode { - internal func mutate(integrity value: String) -> Self { + internal func mutate(integrity value: AttributeData) -> Self { return self.mutate(key: "integrity", value: value) } } extension IntegrityAttribute where Self: EmptyNode { - internal func mutate(integrity value: String) -> Self { + internal func mutate(integrity value: AttributeData) -> Self { return self.mutate(key: "integrity", value: value) } } @@ -1629,14 +1613,14 @@ public protocol IsAttribute: Attribute { extension IsAttribute where Self: ContentNode { - internal func mutate(is value: String) -> Self { + internal func mutate(is value: AttributeData) -> Self { return self.mutate(key: "is", value: value) } } extension IsAttribute where Self: EmptyNode { - internal func mutate(is value: String) -> Self { + internal func mutate(is value: AttributeData) -> Self { return self.mutate(key: "is", value: value) } } @@ -1680,69 +1664,39 @@ public protocol ItemAttribute: Attribute { extension ItemAttribute where Self: ContentNode { - internal func mutate(itemscope value: String) -> Self { + internal func mutate(itemscope value: AttributeData) -> Self { return self.mutate(key: "itemscope", value: value) } - internal func mutate(itemid value: String?) -> Self { - - if let value = value { - return self.mutate(key: "itemid", value: value) - } - - return self + internal func mutate(itemid value: AttributeData) -> Self { + return self.mutate(key: "itemid", value: value) } - internal func mutate(itemtype value: String?) -> Self { - - if let value = value { - return self.mutate(key: "itemtype", value: value) - } - - return self + internal func mutate(itemtype value: AttributeData) -> Self { + return self.mutate(key: "itemtype", value: value) } - internal func mutate(itemref value: String?) -> Self { - - if let value = value { - return self.mutate(key: "itemref", value: value) - } - - return self + internal func mutate(itemref value: AttributeData) -> Self { + return self.mutate(key: "itemref", value: value) } } extension ItemAttribute where Self: EmptyNode { - internal func mutate(itemscope value: String) -> Self { + internal func mutate(itemscope value: AttributeData) -> Self { return self.mutate(key: "itemscope", value: value) } - internal func mutate(itemid value: String?) -> Self { - - if let value = value { - return self.mutate(key: "itemid", value: value) - } - - return self + internal func mutate(itemid value: AttributeData) -> Self { + return self.mutate(key: "itemid", value: value) } - internal func mutate(itemtype value: String?) -> Self { - - if let value = value { - return self.mutate(key: "itemtype", value: value) - } - - return self + internal func mutate(itemtype value: AttributeData) -> Self { + return self.mutate(key: "itemtype", value: value) } - internal func mutate(itemref value: String?) -> Self { - - if let value = value { - return self.mutate(key: "itemref", value: value) - } - - return self + internal func mutate(itemref value: AttributeData) -> Self { + return self.mutate(key: "itemref", value: value) } } @@ -1767,14 +1721,14 @@ public protocol ItemPropertyAttribute: Attribute { extension ItemPropertyAttribute where Self: ContentNode { - internal func mutate(itemprop value: String) -> Self { + internal func mutate(itemprop value: AttributeData) -> Self { return self.mutate(key: "itemprop", value: value) } } extension ItemPropertyAttribute where Self: EmptyNode { - internal func mutate(itemprop value: String) -> Self { + internal func mutate(itemprop value: AttributeData) -> Self { return self.mutate(key: "itemprop", value: value) } } @@ -1799,14 +1753,14 @@ public protocol KindAttribute: Attribute { extension KindAttribute where Self: ContentNode { - internal func mutate(kind value: String) -> Self { + internal func mutate(kind value: AttributeData) -> Self { return self.mutate(key: "kind", value: value) } } extension KindAttribute where Self: EmptyNode { - internal func mutate(kind value: String) -> Self { + internal func mutate(kind value: AttributeData) -> Self { return self.mutate(key: "kind", value: value) } } @@ -1861,22 +1815,14 @@ public protocol LabelAttribute: Attribute { extension LabelAttribute where Self: ContentNode { - internal func mutate(label value: String) -> Self { - return self.mutate(key: "label", value: value) - } - - internal func mutate(label value: LocalizedString) -> Self { + internal func mutate(label value: AttributeData) -> Self { return self.mutate(key: "label", value: value) } } extension LabelAttribute where Self: EmptyNode { - internal func mutate(label value: String) -> Self { - return self.mutate(key: "label", value: value) - } - - internal func mutate(label value: LocalizedString) -> Self { + internal func mutate(label value: AttributeData) -> Self { return self.mutate(key: "label", value: value) } } @@ -1902,14 +1848,14 @@ public protocol LanguageAttribute: Attribute { extension LanguageAttribute where Self: ContentNode { - internal func mutate(lang value: String) -> Self { + internal func mutate(lang value: AttributeData) -> Self { return self.mutate(key: "lang", value: value) } } extension LanguageAttribute where Self: EmptyNode { - internal func mutate(lang value: String) -> Self { + internal func mutate(lang value: AttributeData) -> Self { return self.mutate(key: "lang", value: value) } } @@ -1933,14 +1879,14 @@ public protocol ListAttribute: Attribute { extension ListAttribute where Self: ContentNode { - internal func mutate(list value: String) -> Self { + internal func mutate(list value: AttributeData) -> Self { return self.mutate(key: "list", value: value) } } extension ListAttribute where Self: EmptyNode { - internal func mutate(list value: String) -> Self { + internal func mutate(list value: AttributeData) -> Self { return self.mutate(key: "list", value: value) } } @@ -1967,14 +1913,14 @@ public protocol LoopAttribute: Attribute { extension LoopAttribute where Self: ContentNode { - internal func mutate(loop value: String) -> Self { + internal func mutate(loop value: AttributeData) -> Self { return self.mutate(key: "loop", value: value) } } extension LoopAttribute where Self: EmptyNode { - internal func mutate(loop value: String) -> Self { + internal func mutate(loop value: AttributeData) -> Self { return self.mutate(key: "loop", value: value) } } @@ -1999,14 +1945,14 @@ public protocol LowAttribute: Attribute { extension LowAttribute where Self: ContentNode { - internal func mutate(low value: Float) -> Self { + internal func mutate(low value: AttributeData) -> Self { return self.mutate(key: "low", value: value) } } extension LowAttribute where Self: EmptyNode { - internal func mutate(low value: Float) -> Self { + internal func mutate(low value: AttributeData) -> Self { return self.mutate(key: "low", value: value) } } @@ -2031,14 +1977,14 @@ public protocol MaximumValueAttribute: Attribute { extension MaximumValueAttribute where Self: ContentNode { - internal func mutate(max value: MaximumValueType) -> Self { + internal func mutate(max value: AttributeData) -> Self { return self.mutate(key: "max", value: value) } } extension MaximumValueAttribute where Self: EmptyNode { - internal func mutate(max value: MaximumValueType) -> Self { + internal func mutate(max value: AttributeData) -> Self { return self.mutate(key: "max", value: value) } } @@ -2064,14 +2010,14 @@ public protocol MaximumLengthAttribute: Attribute { extension MaximumLengthAttribute where Self: ContentNode { - internal func mutate(maxlength value: Int) -> Self { + internal func mutate(maxlength value: AttributeData) -> Self { return self.mutate(key: "maxlength", value: value) } } extension MaximumLengthAttribute where Self: EmptyNode { - internal func mutate(maxlength value: Int) -> Self { + internal func mutate(maxlength value: AttributeData) -> Self { return self.mutate(key: "maxlength", value: value) } } @@ -2116,14 +2062,14 @@ public protocol MediaAttribute: Attribute { extension MediaAttribute where Self: ContentNode { - internal func mutate(media value: String) -> Self { + internal func mutate(media value: AttributeData) -> Self { return self.mutate(key: "media", value: value) } } extension MediaAttribute where Self: EmptyNode { - internal func mutate(media value: String) -> Self { + internal func mutate(media value: AttributeData) -> Self { return self.mutate(key: "media", value: value) } } @@ -2148,14 +2094,14 @@ public protocol MethodAttribute: Attribute { extension MethodAttribute where Self: ContentNode { - internal func mutate(method value: String) -> Self { + internal func mutate(method value: AttributeData) -> Self { return self.mutate(key: "method", value: value) } } extension MethodAttribute where Self: EmptyNode { - internal func mutate(method value: String) -> Self { + internal func mutate(method value: AttributeData) -> Self { return self.mutate(key: "method", value: value) } } @@ -2181,14 +2127,14 @@ public protocol MinimumValueAttribute: Attribute { extension MinimumValueAttribute where Self: ContentNode { - internal func mutate(min value: MinimumValueType) -> Self { + internal func mutate(min value: AttributeData) -> Self { return self.mutate(key: "min", value: value) } } extension MinimumValueAttribute where Self: EmptyNode { - internal func mutate(min value: MinimumValueType) -> Self { + internal func mutate(min value: AttributeData) -> Self { return self.mutate(key: "min", value: value) } } @@ -2213,14 +2159,14 @@ public protocol MinimumLengthAttribute: Attribute { extension MinimumLengthAttribute where Self: ContentNode { - internal func mutate(minlength value: Int) -> Self { + internal func mutate(minlength value: AttributeData) -> Self { return self.mutate(key: "minlength", value: value) } } extension MinimumLengthAttribute where Self: EmptyNode { - internal func mutate(minlength value: Int) -> Self { + internal func mutate(minlength value: AttributeData) -> Self { return self.mutate(key: "minlength", value: value) } } @@ -2245,14 +2191,14 @@ public protocol MultipleAttribute: Attribute { extension MultipleAttribute where Self: ContentNode { - internal func mutate(multiple value: String) -> Self { + internal func mutate(multiple value: AttributeData) -> Self { return self.mutate(key: "multiple", value: value) } } extension MultipleAttribute where Self: EmptyNode { - internal func mutate(multiple value: String) -> Self { + internal func mutate(multiple value: AttributeData) -> Self { return self.mutate(key: "multiple", value: value) } } @@ -2276,14 +2222,14 @@ public protocol MutedAttribute: Attribute { extension MutedAttribute where Self: ContentNode { - internal func mutate(muted value: String) -> Self { + internal func mutate(muted value: AttributeData) -> Self { return self.mutate(key: "muted", value: value) } } extension MutedAttribute where Self: EmptyNode { - internal func mutate(muted value: String) -> Self { + internal func mutate(muted value: AttributeData) -> Self { return self.mutate(key: "muted", value: value) } } @@ -2311,14 +2257,14 @@ public protocol NameAttribute: Attribute { extension NameAttribute where Self: ContentNode { - internal func mutate(name value: String) -> Self { + internal func mutate(name value: AttributeData) -> Self { return self.mutate(key: "name", value: value) } } extension NameAttribute where Self: EmptyNode { - internal func mutate(name value: String) -> Self { + internal func mutate(name value: AttributeData) -> Self { return self.mutate(key: "name", value: value) } } @@ -2344,14 +2290,14 @@ public protocol NonceAttribute: Attribute { extension NonceAttribute where Self: ContentNode { - internal func mutate(nonce value: String) -> Self { + internal func mutate(nonce value: AttributeData) -> Self { return self.mutate(key: "nonce" , value: value) } } extension NonceAttribute where Self: EmptyNode { - internal func mutate(nonce value: String) -> Self { + internal func mutate(nonce value: AttributeData) -> Self { return self.mutate(key: "nonce" , value: value) } } @@ -2372,14 +2318,14 @@ public protocol NoValidateAttribute: Attribute { extension NoValidateAttribute where Self: ContentNode { - internal func mutate(novalidate value: String) -> Self { + internal func mutate(novalidate value: AttributeData) -> Self { return self.mutate(key: "novalidate", value: value) } } extension NoValidateAttribute where Self: EmptyNode { - internal func mutate(novalidate value: String) -> Self { + internal func mutate(novalidate value: AttributeData) -> Self { return self.mutate(key: "novalidate", value: value) } } @@ -2410,14 +2356,14 @@ public protocol OpenAttribute: Attribute { extension OpenAttribute where Self: ContentNode { - internal func mutate(open value: String) -> Self { + internal func mutate(open value: AttributeData) -> Self { return self.mutate(key: "open", value: value) } } extension OpenAttribute where Self: EmptyNode { - internal func mutate(open value: String) -> Self { + internal func mutate(open value: AttributeData) -> Self { return self.mutate(key: "open", value: value) } } @@ -2442,14 +2388,14 @@ public protocol OptimumAttribute: Attribute { extension OptimumAttribute where Self: ContentNode { - internal func mutate(optimum value: Float) -> Self { + internal func mutate(optimum value: AttributeData) -> Self { return self.mutate(key: "optimum", value: value) } } extension OptimumAttribute where Self: EmptyNode { - internal func mutate(optimum value: Float) -> Self { + internal func mutate(optimum value: AttributeData) -> Self { return self.mutate(key: "optimum", value: value) } } @@ -2475,14 +2421,14 @@ public protocol PatternAttribute: Attribute { extension PatternAttribute where Self: ContentNode { - internal func mutate(pattern value: String) -> Self { + internal func mutate(pattern value: AttributeData) -> Self { return self.mutate(key: "pattern", value: value) } } extension PatternAttribute where Self: EmptyNode { - internal func mutate(pattern value: String) -> Self { + internal func mutate(pattern value: AttributeData) -> Self { return self.mutate(key: "pattern", value: value) } } @@ -2509,14 +2455,14 @@ public protocol PartAttribute: Attribute { extension PartAttribute where Self: ContentNode { - internal func mutate(part value: String) -> Self { + internal func mutate(part value: AttributeData) -> Self { return self.mutate(key: "part", value: value) } } extension PartAttribute where Self: EmptyNode { - internal func mutate(part value: String) -> Self { + internal func mutate(part value: AttributeData) -> Self { return self.mutate(key: "part", value: value) } } @@ -2543,14 +2489,14 @@ public protocol PingAttribute: Attribute { extension PingAttribute where Self: ContentNode { - internal func mutate(ping value: String) -> Self { + internal func mutate(ping value: AttributeData) -> Self { return self.mutate(key: "ping", value: value) } } extension PingAttribute where Self: EmptyNode { - internal func mutate(ping value: String) -> Self { + internal func mutate(ping value: AttributeData) -> Self { return self.mutate(key: "ping", value: value) } } @@ -2599,22 +2545,14 @@ public protocol PlaceholderAttribute: Attribute { extension PlaceholderAttribute where Self: ContentNode { - internal func mutate(placeholder value: String) -> Self { - return self.mutate(key: "placeholder", value: value) - } - - internal func mutate(placeholder value: LocalizedString) -> Self { + internal func mutate(placeholder value: AttributeData) -> Self { return self.mutate(key: "placeholder", value: value) } } extension PlaceholderAttribute where Self: EmptyNode { - internal func mutate(placeholder value: String) -> Self { - return self.mutate(key: "placeholder", value: value) - } - - internal func mutate(placeholder value: LocalizedString) -> Self { + internal func mutate(placeholder value: AttributeData) -> Self { return self.mutate(key: "placeholder", value: value) } } @@ -2640,14 +2578,14 @@ public protocol PosterAttribute: Attribute { extension PosterAttribute where Self: ContentNode { - internal func mutate(poster value: String) -> Self { + internal func mutate(poster value: AttributeData) -> Self { return self.mutate(key: "poster", value: value) } } extension PosterAttribute where Self: EmptyNode { - internal func mutate(poster value: String) -> Self { + internal func mutate(poster value: AttributeData) -> Self { return self.mutate(key: "poster", value: value) } } @@ -2674,14 +2612,14 @@ public protocol PlaysInlineAttribute: Attribute { extension PlaysInlineAttribute where Self: ContentNode { - internal func mutate(playsinline value: String) -> Self { + internal func mutate(playsinline value: AttributeData) -> Self { return self.mutate(key: "playsinline", value: value) } } extension PlaysInlineAttribute where Self: EmptyNode { - internal func mutate(playsinline value: String) -> Self { + internal func mutate(playsinline value: AttributeData) -> Self { return self.mutate(key: "playsinline", value: value) } } @@ -2709,14 +2647,14 @@ public protocol PreloadAttribute: Attribute { extension PreloadAttribute where Self: ContentNode { - internal func mutate(preload value: String) -> Self { + internal func mutate(preload value: AttributeData) -> Self { return self.mutate(key: "preload", value: value) } } extension PreloadAttribute where Self: EmptyNode { - internal func mutate(preload value: String) -> Self { + internal func mutate(preload value: AttributeData) -> Self { return self.mutate(key: "preload", value: value) } } @@ -2740,14 +2678,14 @@ public protocol ReadOnlyAttribute: Attribute { extension ReadOnlyAttribute where Self: ContentNode { - internal func mutate(readonly value: String) -> Self { + internal func mutate(readonly value: AttributeData) -> Self { return self.mutate(key: "readonly", value: value) } } extension ReadOnlyAttribute where Self: EmptyNode { - internal func mutate(readonly value: String) -> Self { + internal func mutate(readonly value: AttributeData) -> Self { return self.mutate(key: "readonly", value: value) } } @@ -2767,14 +2705,14 @@ public protocol ReferrerPolicyAttribute: Attribute { extension ReferrerPolicyAttribute where Self: ContentNode { - internal func mutate(referrerpolicy value: String) -> Self { + internal func mutate(referrerpolicy value: AttributeData) -> Self { return self.mutate(key: "referrerpolicy", value: value) } } extension ReferrerPolicyAttribute where Self: EmptyNode { - internal func mutate(referrerpolicy value: String) -> Self { + internal func mutate(referrerpolicy value: AttributeData) -> Self { return self.mutate(key: "referrerpolicy", value: value) } } @@ -2801,14 +2739,14 @@ public protocol RelationshipAttribute: Attribute { extension RelationshipAttribute where Self: ContentNode { - internal func mutate(rel value: String) -> Self { + internal func mutate(rel value: AttributeData) -> Self { return self.mutate(key: "rel", value: value) } } extension RelationshipAttribute where Self: EmptyNode { - internal func mutate(rel value: String) -> Self { + internal func mutate(rel value: AttributeData) -> Self { return self.mutate(key: "rel", value: value) } } @@ -2832,14 +2770,14 @@ public protocol RequiredAttribute: Attribute { extension RequiredAttribute where Self: ContentNode { - internal func mutate(required value: String) -> Self { + internal func mutate(required value: AttributeData) -> Self { return self.mutate(key: "required", value: value) } } extension RequiredAttribute where Self: EmptyNode { - internal func mutate(required value: String) -> Self { + internal func mutate(required value: AttributeData) -> Self { return self.mutate(key: "required", value: value) } } @@ -2865,14 +2803,14 @@ public protocol ReversedAttribute: Attribute { extension ReversedAttribute where Self: ContentNode { - internal func mutate(reversed value: String) -> Self { + internal func mutate(reversed value: AttributeData) -> Self { return self.mutate(key: "reversed", value: value) } } extension ReversedAttribute where Self: EmptyNode { - internal func mutate(reversed value: String) -> Self { + internal func mutate(reversed value: AttributeData) -> Self { return self.mutate(key: "reversed", value: value) } } @@ -2899,14 +2837,14 @@ public protocol RoleAttribute: Attribute { extension RoleAttribute where Self: ContentNode { - internal func mutate(role value: String) -> Self { + internal func mutate(role value: AttributeData) -> Self { return self.mutate(key: "role", value: value) } } extension RoleAttribute where Self: EmptyNode { - internal func mutate(role value: String) -> Self { + internal func mutate(role value: AttributeData) -> Self { return self.mutate(key: "role", value: value) } } @@ -2932,14 +2870,14 @@ public protocol RowsAttribute: Attribute { extension RowsAttribute where Self: ContentNode { - internal func mutate(rows value: Int) -> Self { + internal func mutate(rows value: AttributeData) -> Self { return self.mutate(key: "rows", value: value) } } extension RowsAttribute where Self: EmptyNode { - internal func mutate(rows value: Int) -> Self { + internal func mutate(rows value: AttributeData) -> Self { return self.mutate(key: "rows", value: value) } } @@ -2967,14 +2905,14 @@ public protocol RowSpanAttribute: Attribute { extension RowSpanAttribute where Self: ContentNode { - internal func mutate(rowspan value: Int) -> Self { + internal func mutate(rowspan value: AttributeData) -> Self { return self.mutate(key: "rowspan", value: value) } } extension RowSpanAttribute where Self: EmptyNode { - internal func mutate(rowspan value: Int) -> Self { + internal func mutate(rowspan value: AttributeData) -> Self { return self.mutate(key: "rowspan", value: value) } } @@ -3016,14 +2954,14 @@ public protocol SandboxAttribute: Attribute { extension SandboxAttribute where Self: ContentNode { - internal func mutate(sandbox value: String) -> Self { + internal func mutate(sandbox value: AttributeData) -> Self { return self.mutate(key: "sandbox", value: value) } } extension SandboxAttribute where Self: EmptyNode { - internal func mutate(sandbox value: String) -> Self { + internal func mutate(sandbox value: AttributeData) -> Self { return self.mutate(key: "sandbox", value: value) } } @@ -3052,14 +2990,14 @@ public protocol ScopeAttribute: Attribute { extension ScopeAttribute where Self: ContentNode { - internal func mutate(scope value: String) -> Self { + internal func mutate(scope value: AttributeData) -> Self { return self.mutate(key: "scope", value: value) } } extension ScopeAttribute where Self: EmptyNode { - internal func mutate(scope value: String) -> Self { + internal func mutate(scope value: AttributeData) -> Self { return self.mutate(key: "scope", value: value) } } @@ -3094,14 +3032,14 @@ public protocol ShapeAttribute: Attribute { extension ShapeAttribute where Self: ContentNode { - internal func mutate(shape value: String) -> Self { + internal func mutate(shape value: AttributeData) -> Self { return self.mutate(key: "shape", value: value) } } extension ShapeAttribute where Self: EmptyNode { - internal func mutate(shape value: String) -> Self { + internal func mutate(shape value: AttributeData) -> Self { return self.mutate(key: "shape", value: value) } } @@ -3125,14 +3063,14 @@ public protocol SizeAttribute: Attribute { extension SizeAttribute where Self: ContentNode { - internal func mutate(size value: Int) -> Self { + internal func mutate(size value: AttributeData) -> Self { return self.mutate(key: "size", value: value) } } extension SizeAttribute where Self: EmptyNode { - internal func mutate(size value: Int) -> Self { + internal func mutate(size value: AttributeData) -> Self { return self.mutate(key: "size", value: value) } } @@ -3158,14 +3096,14 @@ public protocol SizesAttribute: Attribute { extension SizesAttribute where Self: ContentNode { - internal func mutate(sizes value: String) -> Self { + internal func mutate(sizes value: AttributeData) -> Self { return self.mutate(key: "sizes", value: value) } } extension SizesAttribute where Self: EmptyNode { - internal func mutate(sizes value: String) -> Self { + internal func mutate(sizes value: AttributeData) -> Self { return self.mutate(key: "sizes", value: value) } } @@ -3198,14 +3136,14 @@ public protocol SlotAttribute: Attribute { extension SlotAttribute where Self: ContentNode { - internal func mutate(slot value: String) -> Self { + internal func mutate(slot value: AttributeData) -> Self { return self.mutate(key: "slot", value: value) } } extension SlotAttribute where Self: EmptyNode { - internal func mutate(slot value: String) -> Self { + internal func mutate(slot value: AttributeData) -> Self { return self.mutate(key: "slot", value: value) } } @@ -3229,14 +3167,14 @@ public protocol SpanAttribute: Attribute { extension SpanAttribute where Self: ContentNode { - internal func mutate(span value: Int) -> Self { + internal func mutate(span value: AttributeData) -> Self { return self.mutate(key: "span", value: value) } } extension SpanAttribute where Self: EmptyNode { - internal func mutate(span value: Int) -> Self { + internal func mutate(span value: AttributeData) -> Self { return self.mutate(key: "span", value: value) } } @@ -3260,14 +3198,14 @@ public protocol SpellCheckAttribute: Attribute { extension SpellCheckAttribute where Self: ContentNode { - internal func mutate(spellcheck value: Bool) -> Self { + internal func mutate(spellcheck value: AttributeData) -> Self { return self.mutate(key: "spellcheck", value: value) } } extension SpellCheckAttribute where Self: EmptyNode { - internal func mutate(spellcheck value: Bool) -> Self { + internal func mutate(spellcheck value: AttributeData) -> Self { return self.mutate(key: "spellcheck", value: value) } } @@ -3307,22 +3245,14 @@ public protocol SourceAttribute: Attribute { extension SourceAttribute where Self: ContentNode { - internal func mutate(source value: String) -> Self { - return self.mutate(key: "src", value: value) - } - - internal func mutate(source value: EnvironmentValue) -> Self { + internal func mutate(source value: AttributeData) -> Self { return self.mutate(key: "src", value: value) } } extension SourceAttribute where Self: EmptyNode { - internal func mutate(source value: String) -> Self { - return self.mutate(key: "src", value: value) - } - - internal func mutate(source value: EnvironmentValue) -> Self { + internal func mutate(source value: AttributeData) -> Self { return self.mutate(key: "src", value: value) } } @@ -3347,14 +3277,14 @@ public protocol SourceDocumentAttribute: Attribute { extension SourceDocumentAttribute where Self: ContentNode { - internal func mutate(sourcedocument value: String) -> Self { + internal func mutate(sourcedocument value: AttributeData) -> Self { return self.mutate(key: "srcdoc", value: value) } } extension SourceDocumentAttribute where Self: EmptyNode { - internal func mutate(sourcedocument value: String) -> Self { + internal func mutate(sourcedocument value: AttributeData) -> Self { return self.mutate(key: "srcdoc", value: value) } } @@ -3385,14 +3315,14 @@ public protocol SourceLanguageAttribute: Attribute { extension SourceLanguageAttribute where Self: ContentNode { - internal func mutate(sourcelanguage value: String) -> Self { + internal func mutate(sourcelanguage value: AttributeData) -> Self { return self.mutate(key: "srclang", value: value) } } extension SourceLanguageAttribute where Self: EmptyNode { - internal func mutate(sourcelanguage value: String) -> Self { + internal func mutate(sourcelanguage value: AttributeData) -> Self { return self.mutate(key: "srclang", value: value) } } @@ -3420,14 +3350,14 @@ public protocol StartAttribute: Attribute { extension StartAttribute where Self: ContentNode { - internal func mutate(start value: Int) -> Self { + internal func mutate(start value: AttributeData) -> Self { return self.mutate(key: "start", value: value) } } extension StartAttribute where Self: EmptyNode { - internal func mutate(start value: Int) -> Self { + internal func mutate(start value: AttributeData) -> Self { return self.mutate(key: "start", value: value) } } @@ -3452,14 +3382,14 @@ public protocol StepAttribute: Attribute { extension StepAttribute where Self: ContentNode { - internal func mutate(step value: Int) -> Self { + internal func mutate(step value: AttributeData) -> Self { return self.mutate(key: "step", value: value) } } extension StepAttribute where Self: EmptyNode { - internal func mutate(step value: Int) -> Self { + internal func mutate(step value: AttributeData) -> Self { return self.mutate(key: "step", value: value) } } @@ -3485,22 +3415,14 @@ public protocol StyleAttribute: Attribute { extension StyleAttribute where Self: ContentNode { - internal func mutate(style value: String) -> Self { - return self.mutate(key: "style", value: value) - } - - internal func mutate(style value: TaintedString) -> Self { + internal func mutate(style value: AttributeData) -> Self { return self.mutate(key: "style", value: value) } } extension StyleAttribute where Self: EmptyNode { - internal func mutate(style value: String) -> Self { - return self.mutate(key: "style", value: value) - } - - internal func mutate(style value: TaintedString) -> Self { + internal func mutate(style value: AttributeData) -> Self { return self.mutate(key: "style", value: value) } } @@ -3525,14 +3447,14 @@ public protocol TabulatorAttribute: Attribute { extension TabulatorAttribute where Self: ContentNode { - internal func mutate(tabindex value: Int) -> Self { + internal func mutate(tabindex value: AttributeData) -> Self { return self.mutate(key: "tabindex", value: value) } } extension TabulatorAttribute where Self: EmptyNode { - internal func mutate(tabindex value: Int) -> Self { + internal func mutate(tabindex value: AttributeData) -> Self { return self.mutate(key: "tabindex", value: value) } } @@ -3559,14 +3481,14 @@ public protocol TargetAttribute: Attribute { extension TargetAttribute where Self: ContentNode { - internal func mutate(target value: String) -> Self { + internal func mutate(target value: AttributeData) -> Self { return self.mutate(key: "target", value: value) } } extension TargetAttribute where Self: EmptyNode { - internal func mutate(target value: String) -> Self { + internal func mutate(target value: AttributeData) -> Self { return self.mutate(key: "target", value: value) } } @@ -3621,22 +3543,14 @@ public protocol TitleAttribute: Attribute { extension TitleAttribute where Self: ContentNode { - internal func mutate(title value: String) -> Self { - return self.mutate(key: "title", value: value) - } - - internal func mutate(title value: LocalizedString) -> Self { + internal func mutate(title value: AttributeData) -> Self { return self.mutate(key: "title", value: value) } } extension TitleAttribute where Self: EmptyNode { - internal func mutate(title value: String) -> Self { - return self.mutate(key: "title", value: value) - } - - internal func mutate(title value: LocalizedString) -> Self { + internal func mutate(title value: AttributeData) -> Self { return self.mutate(key: "title", value: value) } } @@ -3662,14 +3576,14 @@ public protocol TranslateAttribute: Attribute { extension TranslateAttribute where Self: ContentNode { - internal func mutate(translate value: String) -> Self { + internal func mutate(translate value: AttributeData) -> Self { return self.mutate(key: "translate", value: value) } } extension TranslateAttribute where Self: EmptyNode { - internal func mutate(translate value: String) -> Self { + internal func mutate(translate value: AttributeData) -> Self { return self.mutate(key: "translate", value: value) } } @@ -3695,14 +3609,14 @@ public protocol TypeAttribute: Attribute { extension TypeAttribute where Self: ContentNode { - internal func mutate(type value: String) -> Self { + internal func mutate(type value: AttributeData) -> Self { return self.mutate(key: "type", value: value) } } extension TypeAttribute where Self: EmptyNode { - internal func mutate(type value: String) -> Self { + internal func mutate(type value: AttributeData) -> Self { return self.mutate(key: "type", value: value) } } @@ -3729,15 +3643,15 @@ public protocol UseMapAttribute: Attribute { extension UseMapAttribute where Self: ContentNode { - internal func mutate(usemap value: String) -> Self { - return self.mutate(key: "usemap", value: "#\(value)") + internal func mutate(usemap value: AttributeData) -> Self { + return self.mutate(key: "usemap", value: value) } } extension UseMapAttribute where Self: EmptyNode { - internal func mutate(usemap value: String) -> Self { - return self.mutate(key: "usemap", value: "#\(value)") + internal func mutate(usemap value: AttributeData) -> Self { + return self.mutate(key: "usemap", value: value) } } @@ -3788,22 +3702,14 @@ public protocol ValueAttribute: Attribute { extension ValueAttribute where Self: ContentNode { - internal func mutate(value: String) -> Self { - return self.mutate(key: "value", value: value) - } - - internal func mutate(value: LocalizedString) -> Self { + internal func mutate(value: AttributeData) -> Self { return self.mutate(key: "value", value: value) } } extension ValueAttribute where Self: EmptyNode { - internal func mutate(value: String) -> Self { - return self.mutate(key: "value", value: value) - } - - internal func mutate(value: LocalizedString) -> Self { + internal func mutate(value: AttributeData) -> Self { return self.mutate(key: "value", value: value) } } @@ -3827,14 +3733,14 @@ public protocol WidthAttribute: Attribute { extension WidthAttribute where Self: ContentNode { - internal func mutate(width value: Int) -> Self { + internal func mutate(width value: AttributeData) -> Self { return self.mutate(key: "width", value: value) } } extension WidthAttribute where Self: EmptyNode { - internal func mutate(width value: Int) -> Self { + internal func mutate(width value: AttributeData) -> Self { return self.mutate(key: "width", value: value) } } @@ -3860,14 +3766,14 @@ public protocol WrapAttribute: Attribute { extension WrapAttribute where Self: ContentNode { - internal func mutate(wrap value: String) -> Self { + internal func mutate(wrap value: AttributeData) -> Self { return self.mutate(key: "wrap", value: value) } } extension WrapAttribute where Self: EmptyNode { - internal func mutate(wrap value: String) -> Self { + internal func mutate(wrap value: AttributeData) -> Self { return self.mutate(key: "wrap", value: value) } } @@ -3892,14 +3798,14 @@ public protocol PropertyAttribute: Attribute { extension PropertyAttribute where Self: ContentNode { - internal func mutate(property value: String) -> Self { + internal func mutate(property value: AttributeData) -> Self { return self.mutate(key: "property", value: value) } } extension PropertyAttribute where Self: EmptyNode { - internal func mutate(property value: String) -> Self { + internal func mutate(property value: AttributeData) -> Self { return self.mutate(key: "property", value: value) } } @@ -3928,14 +3834,14 @@ public protocol SelectedAttribute: Attribute { extension SelectedAttribute where Self: ContentNode { - internal func mutate(selected value: String) -> Self { + internal func mutate(selected value: AttributeData) -> Self { return self.mutate(key: "selected", value: value) } } extension SelectedAttribute where Self: EmptyNode { - internal func mutate(selected value: String) -> Self { + internal func mutate(selected value: AttributeData) -> Self { return self.mutate(key: "selected", value: value) } } @@ -3961,7 +3867,7 @@ public protocol ShadowRootModeAttribute: Attribute { extension ShadowRootModeAttribute where Self: ContentNode { - internal func mutate(shadowrootmode value: String) -> Self { + internal func mutate(shadowrootmode value: AttributeData) -> Self { return self.mutate(key: "shadowrootmode", value: value) } } @@ -3986,14 +3892,14 @@ public protocol InertAttribute: Attribute { extension InertAttribute where Self: ContentNode { - internal func mutate(inert value: String) -> Self { + internal func mutate(inert value: AttributeData) -> Self { return self.mutate(key: "inert", value: value) } } extension InertAttribute where Self: EmptyNode { - internal func mutate(inert value: String) -> Self { + internal func mutate(inert value: AttributeData) -> Self { return self.mutate(key: "inert", value: value) } } @@ -4017,14 +3923,14 @@ public protocol FetchPriorityAttribute: Attribute { extension FetchPriorityAttribute where Self: ContentNode { - internal func mutate(fetchpriority value: String) -> Self { + internal func mutate(fetchpriority value: AttributeData) -> Self { return self.mutate(key: "fetchpriority", value: value) } } extension FetchPriorityAttribute where Self: EmptyNode { - internal func mutate(fetchpriority value: String) -> Self { + internal func mutate(fetchpriority value: AttributeData) -> Self { return self.mutate(key: "fetchpriority", value: value) } } @@ -4049,14 +3955,14 @@ public protocol LoadingAttribute: Attribute { extension LoadingAttribute where Self: ContentNode { - internal func mutate(loading value: String) -> Self { + internal func mutate(loading value: AttributeData) -> Self { return self.mutate(key: "loading", value: value) } } extension LoadingAttribute where Self: EmptyNode { - internal func mutate(loading value: String) -> Self { + internal func mutate(loading value: AttributeData) -> Self { return self.mutate(key: "loading", value: value) } } @@ -4096,14 +4002,14 @@ public protocol SourceSetAttribute: Attribute { extension SourceSetAttribute where Self: ContentNode { - internal func mutate(sourceset value: String) -> Self { + internal func mutate(sourceset value: AttributeData) -> Self { return self.mutate(key: "srcset", value: value) } } extension SourceSetAttribute where Self: EmptyNode { - internal func mutate(sourceset value: String) -> Self { + internal func mutate(sourceset value: AttributeData) -> Self { return self.mutate(key: "srcset", value: value) } } @@ -4129,14 +4035,14 @@ public protocol DecodingAttribute: Attribute { extension DecodingAttribute where Self: ContentNode { - internal func mutate(decoding value: String) -> Self { + internal func mutate(decoding value: AttributeData) -> Self { return self.mutate(key: "decoding", value: value) } } extension DecodingAttribute where Self: EmptyNode { - internal func mutate(decoding value: String) -> Self { + internal func mutate(decoding value: AttributeData) -> Self { return self.mutate(key: "decoding", value: value) } } @@ -4162,14 +4068,14 @@ public protocol BlockingAttribute: Attribute { extension BlockingAttribute where Self: ContentNode { - internal func mutate(blocking value: String) -> Self { + internal func mutate(blocking value: AttributeData) -> Self { return self.mutate(key: "blocking", value: value) } } extension BlockingAttribute where Self: EmptyNode { - internal func mutate(blocking value: String) -> Self { + internal func mutate(blocking value: AttributeData) -> Self { return self.mutate(key: "blocking", value: value) } } @@ -4194,14 +4100,14 @@ public protocol PopoverAttribute: Attribute { extension PopoverAttribute where Self: ContentNode { - internal func mutate(popover value: String) -> Self { + internal func mutate(popover value: AttributeData) -> Self { return self.mutate(key: "popover", value: value) } } extension PopoverAttribute where Self: EmptyNode { - internal func mutate(popover value: String) -> Self { + internal func mutate(popover value: AttributeData) -> Self { return self.mutate(key: "popover", value: value) } } @@ -4232,34 +4138,16 @@ public protocol PopoverTargetAttribute: Attribute { extension PopoverTargetAttribute where Self: ContentNode { - internal func mutate(popovertarget value: String) -> Self { + internal func mutate(popovertarget value: AttributeData) -> Self { return self.mutate(key: "popovertarget", value: value) } - - internal func mutate(popovertargetaction value: String?) -> Self { - - if let value = value { - return self.mutate(key: "popovertargetaction", value: value) - } - - return self - } } extension PopoverTargetAttribute where Self: EmptyNode { - internal func mutate(popovertarget value: String) -> Self { + internal func mutate(popovertarget value: AttributeData) -> Self { return self.mutate(key: "popovertarget", value: value) } - - internal func mutate(popovertargetaction value: String?) -> Self { - - if let value = value { - return self.mutate(key: "popovertargetaction", value: value) - } - - return self - } } /// A type that provides the `popoverAction` modifier @@ -4284,14 +4172,14 @@ public protocol PopoverActionAttribute: Attribute { extension PopoverActionAttribute where Self: ContentNode { - internal func mutate(popoveraction value: String) -> Self { + internal func mutate(popoveraction value: AttributeData) -> Self { return self.mutate(key: "popovertargetaction", value: value) } } extension PopoverActionAttribute where Self: EmptyNode { - internal func mutate(popoveraction value: String) -> Self { + internal func mutate(popoveraction value: AttributeData) -> Self { return self.mutate(key: "popovertargetaction", value: value) } } diff --git a/Sources/HTMLKit/Abstraction/Attributes/VectorAttributes.swift b/Sources/HTMLKit/Abstraction/Attributes/VectorAttributes.swift index 902ed1d5..f7ca6192 100644 --- a/Sources/HTMLKit/Abstraction/Attributes/VectorAttributes.swift +++ b/Sources/HTMLKit/Abstraction/Attributes/VectorAttributes.swift @@ -25,7 +25,7 @@ public protocol DrawAttribute: Attribute { extension DrawAttribute where Self: ContentNode { - internal func mutate(draw value: String) -> Self { + internal func mutate(draw value: AttributeData) -> Self { return self.mutate(key: "d", value: value) } } @@ -53,18 +53,9 @@ public protocol FillAttribute: Attribute { extension FillAttribute where Self: ContentNode { - internal func mutate(fill value: String) -> Self { + internal func mutate(fill value: AttributeData) -> Self { return self.mutate(key: "fill", value: value) } - - internal func mutate(fillopacity value: Double?) -> Self { - - if let value = value { - return self.mutate(key: "fill-opacity", value: value) - } - - return self - } } /// A type that provides the `fillOpacity` modifier. @@ -89,7 +80,7 @@ public protocol FillOpacityAttribute: Attribute { extension FillOpacityAttribute where Self: ContentNode { - internal func mutate(fillopacity value: Double) -> Self { + internal func mutate(fillopacity value: AttributeData) -> Self { return self.mutate(key: "fill-opacity", value: value) } } @@ -120,44 +111,24 @@ public protocol StrokeAttribute: Attribute { extension StrokeAttribute where Self: ContentNode { - internal func mutate(stroke value: String) -> Self { + internal func mutate(stroke value: AttributeData) -> Self { return self.mutate(key: "stroke", value: value) } - internal func mutate(strokewidth value: Int?) -> Self { - - if let value = value { - return self.mutate(key: "stroke-width", value: value) - } - - return self + internal func mutate(strokewidth value: AttributeData) -> Self { + return self.mutate(key: "stroke-width", value: value) } - internal func mutate(strokeopacity value: Double?) -> Self { - - if let value = value { - return self.mutate(key: "stroke-opacity", value: value) - } - - return self + internal func mutate(strokeopacity value: AttributeData) -> Self { + return self.mutate(key: "stroke-opacity", value: value) } - internal func mutate(strokelinecap value: String?) -> Self { - - if let value = value { - return self.mutate(key: "stroke-linecap", value: value) - } - - return self + internal func mutate(strokelinecap value: AttributeData) -> Self { + return self.mutate(key: "stroke-linecap", value: value) } - internal func mutate(strokelinejoin value: String?) -> Self { - - if let value = value { - return self.mutate(key: "stroke-linejoin", value: value) - } - - return self + internal func mutate(strokelinejoin value: AttributeData) -> Self { + return self.mutate(key: "stroke-linejoin", value: value) } } @@ -181,13 +152,6 @@ public protocol StrokeWidthAttribute: Attribute { func strokeWidth(_ size: Int) -> Self } -extension StrokeWidthAttribute where Self: ContentNode { - - internal func mutate(strokewidth value: Int) -> Self { - return self.mutate(key: "stroke-width", value: value) - } -} - /// A type that provides the `strokeOpacity` modifier. @_documentation(visibility: internal) public protocol StrokeOpacityAttribute: Attribute { @@ -208,13 +172,6 @@ public protocol StrokeOpacityAttribute: Attribute { func strokeOpacity(_ value: Double) -> Self } -extension StrokeOpacityAttribute where Self: ContentNode { - - internal func mutate(strokeopacity value: Double) -> Self { - return self.mutate(key: "stroke-opacity", value: value) - } -} - /// A type that provides the `strokeLineCap` modifier. @_documentation(visibility: internal) public protocol StrokeLineCapAttribute: Attribute { @@ -235,13 +192,6 @@ public protocol StrokeLineCapAttribute: Attribute { func strokeLineCap(_ value: Values.Linecap) -> Self } -extension StrokeLineCapAttribute where Self: ContentNode { - - internal func mutate(strokelinecap value: String) -> Self { - return self.mutate(key: "stroke-linecap", value: value) - } -} - /// A type that provides the `strokeLineJoin` modifier. @_documentation(visibility: internal) public protocol StrokeLineJoinAttribute: Attribute { @@ -262,12 +212,6 @@ public protocol StrokeLineJoinAttribute: Attribute { func strokeLineJoin(_ value: Values.Linejoin) -> Self } -extension StrokeLineJoinAttribute where Self: ContentNode { - - internal func mutate(strokelinejoin value: String) -> Self { - return self.mutate(key: "stroke-linejoin", value: value) - } -} /// A type that provides the `radius` modifier. @_documentation(visibility: internal) @@ -291,7 +235,7 @@ public protocol RadiusAttribute: Attribute { extension RadiusAttribute where Self: ContentNode { - internal func mutate(radius value: Int) -> Self { + internal func mutate(radius value: AttributeData) -> Self { return self.mutate(key: "r", value: value) } } @@ -351,11 +295,11 @@ public protocol PositionPointAttribute: Attribute { extension PositionPointAttribute where Self: ContentNode { - internal func mutate(x value: String) -> Self { + internal func mutate(x value: AttributeData) -> Self { return self.mutate(key: "x", value: value) } - internal func mutate(y value: String) -> Self { + internal func mutate(y value: AttributeData) -> Self { return self.mutate(key: "y", value: value) } } @@ -415,11 +359,11 @@ public protocol RadiusPointAttribute: Attribute { extension RadiusPointAttribute where Self: ContentNode { - internal func mutate(rx value: String) -> Self { + internal func mutate(rx value: AttributeData) -> Self { return self.mutate(key: "rx", value: value) } - internal func mutate(ry value: String) -> Self { + internal func mutate(ry value: AttributeData) -> Self { return self.mutate(key: "ry", value: value) } } @@ -481,11 +425,11 @@ public protocol CenterPointAttribute: Attribute { extension CenterPointAttribute where Self: ContentNode { - internal func mutate(cx value: String) -> Self { + internal func mutate(cx value: AttributeData) -> Self { return self.mutate(key: "cx", value: value) } - internal func mutate(cy value: String) -> Self { + internal func mutate(cy value: AttributeData) -> Self { return self.mutate(key: "cy", value: value) } } @@ -531,7 +475,7 @@ public protocol ViewBoxAttribute: Attribute { extension ViewBoxAttribute where Self: ContentNode { - internal func mutate(viewbox value: String) -> Self { + internal func mutate(viewbox value: AttributeData) -> Self { return self.mutate(key: "viewbox", value: value) } } @@ -556,7 +500,7 @@ public protocol NamespaceAttribute: Attribute { extension NamespaceAttribute where Self: ContentNode { - internal func mutate(namespace value: String) -> Self { + internal func mutate(namespace value: AttributeData) -> Self { return self.mutate(key: "xmlns", value: value) } } @@ -583,7 +527,7 @@ public protocol PointsAttribute: Attribute { extension PointsAttribute where Self: ContentNode { - internal func mutate(points value: String) -> Self { + internal func mutate(points value: AttributeData) -> Self { return self.mutate(key: "points", value: value) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/BasicElements.swift b/Sources/HTMLKit/Abstraction/Elements/BasicElements.swift index 95880cc7..7616183d 100644 --- a/Sources/HTMLKit/Abstraction/Elements/BasicElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/BasicElements.swift @@ -79,7 +79,7 @@ public struct Html: ContentNode, BasicElement { internal var name: String { "html" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [HtmlElement] @@ -94,7 +94,7 @@ public struct Html: ContentNode, BasicElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [HtmlElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [HtmlElement]) { self.attributes = attributes self.context = context @@ -123,196 +123,248 @@ public struct Html: ContentNode, BasicElement { extension Html: GlobalAttributes, GlobalEventAttributes { public func accessKey(_ value: Character) -> Html { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Html { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Html { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Html { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Html { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Html { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Html { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Html { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Html { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Html { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Html { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Html { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Html { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Html { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Html { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Html { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Html { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Html { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Html { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Html { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Html { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Html { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Html { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Html { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Html { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Html { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Html { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Html { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Html { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Html { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Html { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Html { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Html { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Html { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Html { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Html { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Html { + return mutate(key: key, value: .init(value, context: context)) } - public func custom(key: String, value: Any) -> Html { - return mutate(key: key, value: value) + public func custom(key: String, value: Int) -> Html { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Html { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Html { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Html { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Html { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Html { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Html { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Html { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Html { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Html { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -328,7 +380,7 @@ public struct Custom: CustomNode, GlobalElement { public var name: String - public var attributes: OrderedDictionary? + public var attributes: OrderedDictionary? public var content: [Content] @@ -346,7 +398,7 @@ public struct Custom: CustomNode, GlobalElement { self.content = content() } - public init(name: String, attributes: OrderedDictionary?, context: EscapeContext = .tainted(.html), content: [Content]) { + public init(name: String, attributes: OrderedDictionary?, context: EscapeContext = .tainted(.html), content: [Content]) { self.name = name self.attributes = attributes @@ -375,7 +427,27 @@ public struct Custom: CustomNode, GlobalElement { extension Custom: Attribute { - public func custom(key: String, value: Any) -> Custom { - return mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Custom { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Custom { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Custom { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Custom { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Custom { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Custom { + return mutate(key: key, value: .init(value, context: context)) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/BodyElements.swift b/Sources/HTMLKit/Abstraction/Elements/BodyElements.swift index f8fe5b5a..92e60ec5 100644 --- a/Sources/HTMLKit/Abstraction/Elements/BodyElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/BodyElements.swift @@ -163,7 +163,7 @@ public struct Article: ContentNode, HtmlElement, BodyElement, FormElement, Figur internal var name: String { "article" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -178,7 +178,7 @@ public struct Article: ContentNode, HtmlElement, BodyElement, FormElement, Figur self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -207,272 +207,324 @@ public struct Article: ContentNode, HtmlElement, BodyElement, FormElement, Figur extension Article: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Article { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Article { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Article { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Article { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Article { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Article { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Article { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Article { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Article { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Article { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Article { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Article { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Article { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Article { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Article { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Article { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Article { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Article { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Article { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Article { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Article { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Article { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Article { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Article { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Article { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Article { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Article { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Article { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Article { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Article { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Article { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Article { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Article { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Article { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Article { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Article { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Article { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Article { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Article { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Article { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Article { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Article { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Article { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Article { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Article { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Article { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Article { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Article { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Article { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Article { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Article { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Article { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Article { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Article { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Article { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Article { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Article { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Article { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Article { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Article { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Article { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Article { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Article { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Article { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Article { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Article { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Article { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -494,7 +546,7 @@ public struct Section: ContentNode, HtmlElement, BodyElement, FigureElement, For internal var name: String { "section" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -509,7 +561,7 @@ public struct Section: ContentNode, HtmlElement, BodyElement, FigureElement, For self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -538,272 +590,324 @@ public struct Section: ContentNode, HtmlElement, BodyElement, FigureElement, For extension Section: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Section { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Section { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Section { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Section { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Section { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Section { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Section { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Section { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Section { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Section { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Section { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Section { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Section { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Section { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Section { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Section { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Section { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Section { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Section { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Section { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Section { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Section { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Section { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Section { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Section { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Section { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Section { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Section { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Section { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Section { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Section { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Section { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Section { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Section { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Section { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Section { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Section { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Section { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Section { - return mutate(key: key, value: value) + public func custom(key: String, value: Double) -> Section { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Section { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Section { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Section { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Section { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Section { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Section { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Section { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Section { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Section { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Section { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Section { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Section { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Section { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Section { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Section { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Section { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Section { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Section { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Section { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Section { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Section { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Section { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Section { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Section { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Section { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Section { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Section { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -827,7 +931,7 @@ public struct Navigation: ContentNode, HtmlElement, BodyElement, FormElement, Fi internal var name: String { "nav" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -842,7 +946,7 @@ public struct Navigation: ContentNode, HtmlElement, BodyElement, FormElement, Fi self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -871,272 +975,324 @@ public struct Navigation: ContentNode, HtmlElement, BodyElement, FormElement, Fi extension Navigation: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Navigation { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Navigation { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Navigation { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Navigation { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Navigation { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Navigation { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Navigation { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Navigation { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Navigation { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Navigation { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Navigation { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Navigation { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Navigation { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Navigation { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Navigation { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Navigation { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Navigation { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Navigation { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Navigation { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Navigation { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Navigation { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Navigation { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Navigation { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Navigation { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Navigation { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Navigation { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Navigation { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Navigation { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Navigation { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Navigation { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Navigation { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Navigation { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Navigation { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Navigation { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Navigation { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Navigation { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Navigation { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Navigation { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Navigation { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Navigation { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Navigation { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Navigation { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Navigation { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Navigation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Navigation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Navigation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Navigation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Navigation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Navigation { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Navigation { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Navigation { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Navigation { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Navigation { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Navigation { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Navigation { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Navigation { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Navigation { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Navigation { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Navigation { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Navigation { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Navigation { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Navigation { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Navigation { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Navigation { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Navigation { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Navigation { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Navigation { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -1156,7 +1312,7 @@ public struct Aside: ContentNode, HtmlElement, BodyElement, FormElement, FigureE internal var name: String { "aside" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -1171,7 +1327,7 @@ public struct Aside: ContentNode, HtmlElement, BodyElement, FormElement, FigureE self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -1200,272 +1356,324 @@ public struct Aside: ContentNode, HtmlElement, BodyElement, FormElement, FigureE extension Aside: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Aside { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Aside { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Aside { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Aside { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Aside { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Aside { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Aside { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Aside { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Aside { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Aside { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Aside { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Aside { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Aside { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Aside { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Aside { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Aside { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Aside { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Aside { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Aside { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Aside { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Aside { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Aside { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Aside { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Aside { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Aside { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Aside { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Aside { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Aside { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Aside { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Aside { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Aside { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Aside { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Aside { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Aside { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Aside { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Aside { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Aside { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Aside { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Aside { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Aside { - return mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> Aside { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Aside { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Aside { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Aside { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Aside { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Aside { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Aside { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Aside { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Aside { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Aside { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Aside { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Aside { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Aside { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Aside { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Aside { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Aside { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Aside { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Aside { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Aside { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Aside { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Aside { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Aside { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Aside { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Aside { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Aside { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Aside { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Aside { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -1482,7 +1690,7 @@ public struct Heading1: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var name: String { "h1" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -1497,7 +1705,7 @@ public struct Heading1: ContentNode, HtmlElement, BodyElement, FormElement, Figu self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -1526,272 +1734,324 @@ public struct Heading1: ContentNode, HtmlElement, BodyElement, FormElement, Figu extension Heading1: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Heading1 { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Heading1 { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Heading1 { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Heading1 { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Heading1 { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Heading1 { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Heading1 { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Heading1 { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Heading1 { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Heading1 { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Heading1 { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Heading1 { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Heading1 { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Heading1 { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Heading1 { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Heading1 { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Heading1 { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Heading1 { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Heading1 { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Heading1 { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Heading1 { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Heading1 { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Heading1 { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Heading1 { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Heading1 { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Heading1 { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Heading1 { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Heading1 { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Heading1 { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Heading1 { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Heading1 { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Heading1 { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Heading1 { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Heading1 { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Heading1 { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Heading1 { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Heading1 { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Heading1 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Heading1 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Heading1 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Heading1 { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Heading1 { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Heading1 { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Heading1 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Heading1 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Heading1 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Heading1 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Heading1 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Heading1 { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Heading1 { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Heading1 { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Heading1 { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Heading1 { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Heading1 { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Heading1 { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Heading1 { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Heading1 { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Heading1 { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Heading1 { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Heading1 { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Heading1 { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Heading1 { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Heading1 { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Heading1 { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Heading1 { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Heading1 { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Heading1 { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -1817,7 +2077,7 @@ public struct Heading2: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var name: String { "h2" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -1832,7 +2092,7 @@ public struct Heading2: ContentNode, HtmlElement, BodyElement, FormElement, Figu self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -1861,272 +2121,324 @@ public struct Heading2: ContentNode, HtmlElement, BodyElement, FormElement, Figu extension Heading2: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Heading2 { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Heading2 { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Heading2 { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Heading2 { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Heading2 { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Heading2 { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Heading2 { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Heading2 { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Heading2 { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Heading2 { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Heading2 { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Heading2 { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Heading2 { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Heading2 { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Heading2 { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Heading2 { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Heading2 { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Heading2 { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Heading2 { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Heading2 { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Heading2 { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Heading2 { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Heading2 { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Heading2 { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Heading2 { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Heading2 { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Heading2 { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Heading2 { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Heading2 { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Heading2 { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Heading2 { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Heading2 { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Heading2 { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Heading2 { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Heading2 { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Heading2 { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Heading2 { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Heading2 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Heading2 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Heading2 { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Heading2 { - return mutate(key: key, value: value) + public func custom(key: String, value: Float) -> Heading2 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Heading2 { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Heading2 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Heading2 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Heading2 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Heading2 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Heading2 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Heading2 { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Heading2 { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Heading2 { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Heading2 { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Heading2 { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Heading2 { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Heading2 { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Heading2 { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Heading2 { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Heading2 { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Heading2 { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Heading2 { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Heading2 { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Heading2 { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Heading2 { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Heading2 { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Heading2 { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Heading2 { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Heading2 { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -2152,7 +2464,7 @@ public struct Heading3: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var name: String { "h3" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -2167,7 +2479,7 @@ public struct Heading3: ContentNode, HtmlElement, BodyElement, FormElement, Figu self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -2196,272 +2508,324 @@ public struct Heading3: ContentNode, HtmlElement, BodyElement, FormElement, Figu extension Heading3: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Heading3 { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Heading3 { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Heading3 { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Heading3 { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Heading3 { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Heading3 { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Heading3 { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Heading3 { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Heading3 { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Heading3 { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Heading3 { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Heading3 { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Heading3 { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Heading3 { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Heading3 { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Heading3 { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Heading3 { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Heading3 { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Heading3 { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Heading3 { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Heading3 { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Heading3 { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Heading3 { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Heading3 { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Heading3 { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Heading3 { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Heading3 { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Heading3 { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Heading3 { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Heading3 { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Heading3 { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Heading3 { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Heading3 { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Heading3 { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Heading3 { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Heading3 { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Heading3 { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Heading3 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Heading3 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Heading3 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Heading3 { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Heading3 { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Heading3 { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Heading3 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Heading3 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Heading3 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Heading3 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Heading3 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Heading3 { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Heading3 { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Heading3 { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Heading3 { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Heading3 { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Heading3 { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Heading3 { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Heading3 { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Heading3 { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Heading3 { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Heading3 { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Heading3 { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Heading3 { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Heading3 { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Heading3 { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Heading3 { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Heading3 { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Heading3 { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Heading3 { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -2487,7 +2851,7 @@ public struct Heading4: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var name: String { "h4" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -2502,7 +2866,7 @@ public struct Heading4: ContentNode, HtmlElement, BodyElement, FormElement, Figu self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -2531,272 +2895,324 @@ public struct Heading4: ContentNode, HtmlElement, BodyElement, FormElement, Figu extension Heading4: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Heading4 { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Heading4 { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Heading4 { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Heading4 { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Heading4 { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Heading4 { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Heading4 { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Heading4 { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Heading4 { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Heading4 { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Heading4 { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Heading4 { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Heading4 { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Heading4 { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Heading4 { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Heading4 { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Heading4 { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Heading4 { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Heading4 { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Heading4 { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Heading4 { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Heading4 { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Heading4 { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Heading4 { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Heading4 { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Heading4 { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Heading4 { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Heading4 { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Heading4 { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Heading4 { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Heading4 { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Heading4 { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Heading4 { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Heading4 { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Heading4 { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Heading4 { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Heading4 { + return mutate(key: key, value: .init(value, context: context)) } - public func custom(key: String, value: Any) -> Heading4 { - return mutate(key: key, value: value) + public func custom(key: String, value: Int) -> Heading4 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Heading4 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Heading4 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Heading4 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Heading4 { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Heading4 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Heading4 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Heading4 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Heading4 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Heading4 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Heading4 { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Heading4 { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Heading4 { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Heading4 { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Heading4 { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Heading4 { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Heading4 { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Heading4 { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Heading4 { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Heading4 { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Heading4 { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Heading4 { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Heading4 { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Heading4 { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Heading4 { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Heading4 { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Heading4 { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Heading4 { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Heading4 { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -2822,7 +3238,7 @@ public struct Heading5: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var name: String { "h5" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -2837,7 +3253,7 @@ public struct Heading5: ContentNode, HtmlElement, BodyElement, FormElement, Figu self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -2866,272 +3282,324 @@ public struct Heading5: ContentNode, HtmlElement, BodyElement, FormElement, Figu extension Heading5: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Heading5 { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Heading5 { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Heading5 { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Heading5 { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Heading5 { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Heading5 { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Heading5 { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Heading5 { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Heading5 { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Heading5 { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Heading5 { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Heading5 { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Heading5 { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Heading5 { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Heading5 { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Heading5 { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Heading5 { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Heading5 { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Heading5 { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Heading5 { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Heading5 { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Heading5 { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Heading5 { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Heading5 { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Heading5 { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Heading5 { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Heading5 { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Heading5 { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Heading5 { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Heading5 { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Heading5 { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Heading5 { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Heading5 { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Heading5 { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Heading5 { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Heading5 { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Heading5 { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Heading5 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Heading5 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Heading5 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Heading5 { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Heading5 { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Heading5 { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Heading5 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Heading5 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Heading5 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Heading5 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Heading5 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Heading5 { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Heading5 { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Heading5 { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Heading5 { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Heading5 { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Heading5 { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Heading5 { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Heading5 { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Heading5 { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Heading5 { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Heading5 { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Heading5 { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Heading5 { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Heading5 { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Heading5 { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Heading5 { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Heading5 { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Heading5 { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Heading5 { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -3157,7 +3625,7 @@ public struct Heading6: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var name: String { "h6" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -3172,7 +3640,7 @@ public struct Heading6: ContentNode, HtmlElement, BodyElement, FormElement, Figu self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -3201,272 +3669,324 @@ public struct Heading6: ContentNode, HtmlElement, BodyElement, FormElement, Figu extension Heading6: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Heading6 { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Heading6 { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Heading6 { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Heading6 { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Heading6 { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Heading6 { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Heading6 { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Heading6 { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Heading6 { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Heading6 { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Heading6 { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Heading6 { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Heading6 { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Heading6 { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Heading6 { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Heading6 { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) - } - @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") - public func itemId(_ value: String) -> Heading6 { - return mutate(itemid: value) - } + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy + } + + @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") + public func itemId(_ value: String) -> Heading6 { + return mutate(itemid: .init(value, context: .tainted(.html))) + } public func itemProperty(_ value: String) -> Heading6 { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Heading6 { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Heading6 { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Heading6 { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Heading6 { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Heading6 { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Heading6 { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Heading6 { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Heading6 { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Heading6 { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Heading6 { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Heading6 { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Heading6 { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Heading6 { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Heading6 { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Heading6 { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Heading6 { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Heading6 { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Heading6 { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Heading6 { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Heading6 { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Heading6 { - return mutate(key: key, value: value) + public func custom(key: String, value: Double) -> Heading6 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Heading6 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Heading6 { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Heading6 { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Heading6 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Heading6 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Heading6 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Heading6 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Heading6 { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Heading6 { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Heading6 { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Heading6 { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Heading6 { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Heading6 { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Heading6 { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Heading6 { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Heading6 { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Heading6 { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Heading6 { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Heading6 { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Heading6 { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Heading6 { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Heading6 { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Heading6 { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Heading6 { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Heading6 { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Heading6 { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Heading6 { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -3497,7 +4017,7 @@ public struct HeadingGroup: ContentNode, HtmlElement, BodyElement, FormElement, internal var name: String { "hgroup" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -3512,7 +4032,7 @@ public struct HeadingGroup: ContentNode, HtmlElement, BodyElement, FormElement, self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -3541,272 +4061,324 @@ public struct HeadingGroup: ContentNode, HtmlElement, BodyElement, FormElement, extension HeadingGroup: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> HeadingGroup { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> HeadingGroup { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> HeadingGroup { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> HeadingGroup { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> HeadingGroup { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> HeadingGroup { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> HeadingGroup { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> HeadingGroup { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> HeadingGroup { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> HeadingGroup { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> HeadingGroup { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> HeadingGroup { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> HeadingGroup { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> HeadingGroup { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> HeadingGroup { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> HeadingGroup { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> HeadingGroup { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> HeadingGroup { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> HeadingGroup { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> HeadingGroup { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> HeadingGroup { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> HeadingGroup { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> HeadingGroup { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> HeadingGroup { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> HeadingGroup { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> HeadingGroup { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> HeadingGroup { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> HeadingGroup { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> HeadingGroup { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> HeadingGroup { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> HeadingGroup { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> HeadingGroup { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> HeadingGroup { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> HeadingGroup { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> HeadingGroup { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> HeadingGroup { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> HeadingGroup { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> HeadingGroup { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> HeadingGroup { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> HeadingGroup { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> HeadingGroup { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> HeadingGroup { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> HeadingGroup { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> HeadingGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> HeadingGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> HeadingGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> HeadingGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> HeadingGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> HeadingGroup { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> HeadingGroup { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> HeadingGroup { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> HeadingGroup { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> HeadingGroup { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> HeadingGroup { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> HeadingGroup { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> HeadingGroup { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> HeadingGroup { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> HeadingGroup { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> HeadingGroup { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> HeadingGroup { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> HeadingGroup { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> HeadingGroup { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> HeadingGroup { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> HeadingGroup { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> HeadingGroup { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> HeadingGroup { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> HeadingGroup { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -3824,7 +4396,7 @@ public struct Header: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var name: String { "header" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -3839,7 +4411,7 @@ public struct Header: ContentNode, HtmlElement, BodyElement, FormElement, Figure self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -3868,272 +4440,324 @@ public struct Header: ContentNode, HtmlElement, BodyElement, FormElement, Figure extension Header: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Header { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Header { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Header { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Header { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Header { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Header { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Header { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Header { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Header { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Header { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Header { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Header { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Header { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Header { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Header { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Header { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Header { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Header { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Header { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Header { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Header { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Header { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Header { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Header { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Header { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Header { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Header { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Header { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Header { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Header { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Header { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Header { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Header { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Header { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Header { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Header { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Header { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Header { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Header { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Header { - return mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> Header { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Header { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Header { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Header { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Header { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Header { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Header { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Header { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Header { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Header { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Header { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Header { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Header { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Header { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Header { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Header { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Header { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Header { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Header { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Header { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Header { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Header { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Header { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Header { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Header { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Header { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Header { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -4149,7 +4773,7 @@ public struct Footer: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var name: String { "footer" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -4164,7 +4788,7 @@ public struct Footer: ContentNode, HtmlElement, BodyElement, FormElement, Figure self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -4193,272 +4817,324 @@ public struct Footer: ContentNode, HtmlElement, BodyElement, FormElement, Figure extension Footer: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Footer { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Footer { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Footer { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Footer { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Footer { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Footer { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Footer { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Footer { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Footer { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Footer { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Footer { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Footer { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Footer { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Footer { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Footer { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Footer { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Footer { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Footer { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Footer { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Footer { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Footer { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Footer { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Footer { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Footer { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Footer { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Footer { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Footer { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Footer { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Footer { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Footer { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Footer { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Footer { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Footer { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Footer { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Footer { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Footer { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Footer { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Footer { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Footer { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Footer { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Footer { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Footer { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Footer { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Footer { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Footer { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Footer { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Footer { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Footer { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Footer { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Footer { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Footer { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Footer { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Footer { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Footer { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Footer { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Footer { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Footer { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Footer { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Footer { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Footer { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Footer { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Footer { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Footer { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Footer { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Footer { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Footer { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Footer { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -4481,7 +5157,7 @@ public struct Address: ContentNode, HtmlElement, BodyElement, FormElement, Figur internal var name: String { "address" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -4496,7 +5172,7 @@ public struct Address: ContentNode, HtmlElement, BodyElement, FormElement, Figur self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -4525,272 +5201,324 @@ public struct Address: ContentNode, HtmlElement, BodyElement, FormElement, Figur extension Address: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Address { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Address { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Address { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Address { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Address { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Address { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Address { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Address { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Address { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Address { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Address { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Address { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Address { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Address { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Address { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Address { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Address { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Address { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Address { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Address { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Address { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Address { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Address { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Address { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Address { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Address { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Address { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Address { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Address { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Address { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Address { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Address { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Address { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Address { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Address { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Address { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Address { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Address { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Address { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Address { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Address { - return mutate(key: key, value: value) + public func custom(key: String, value: Float) -> Address { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Address { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Address { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Address { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Address { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Address { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Address { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Address { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Address { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Address { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Address { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Address { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Address { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Address { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Address { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Address { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Address { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Address { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Address { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Address { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Address { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Address { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Address { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Address { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Address { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Address { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -4807,7 +5535,7 @@ public struct Paragraph: ContentNode, HtmlElement, BodyElement, FormElement, Fig internal var name: String { "p" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -4822,7 +5550,7 @@ public struct Paragraph: ContentNode, HtmlElement, BodyElement, FormElement, Fig self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -4851,272 +5579,324 @@ public struct Paragraph: ContentNode, HtmlElement, BodyElement, FormElement, Fig extension Paragraph: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Paragraph { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Paragraph { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Paragraph { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Paragraph { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Paragraph { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Paragraph { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Paragraph { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Paragraph { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Paragraph { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Paragraph { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Paragraph { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Paragraph { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Paragraph { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Paragraph { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Paragraph { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Paragraph { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Paragraph { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Paragraph { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Paragraph { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Paragraph { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Paragraph { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Paragraph { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Paragraph { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Paragraph { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Paragraph { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Paragraph { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Paragraph { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Paragraph { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Paragraph { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Paragraph { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Paragraph { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Paragraph { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Paragraph { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Paragraph { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Paragraph { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Paragraph { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Paragraph { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Paragraph { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Paragraph { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Paragraph { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Paragraph { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Paragraph { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Paragraph { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Paragraph { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Paragraph { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Paragraph { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Paragraph { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Paragraph { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Paragraph { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Paragraph { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Paragraph { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Paragraph { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Paragraph { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Paragraph { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Paragraph { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Paragraph { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Paragraph { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Paragraph { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Paragraph { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Paragraph { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Paragraph { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Paragraph { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Paragraph { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Paragraph { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Paragraph { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Paragraph { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Paragraph { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -5146,12 +5926,12 @@ public struct HorizontalRule: EmptyNode, HtmlElement, BodyElement, FormElement, internal var name: String { "hr" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Create a horizontal rule. public init() {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -5177,272 +5957,324 @@ public struct HorizontalRule: EmptyNode, HtmlElement, BodyElement, FormElement, extension HorizontalRule: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> HorizontalRule { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> HorizontalRule { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> HorizontalRule { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> HorizontalRule { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> HorizontalRule { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> HorizontalRule { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> HorizontalRule { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> HorizontalRule { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> HorizontalRule { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> HorizontalRule { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> HorizontalRule { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> HorizontalRule { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> HorizontalRule { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> HorizontalRule { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> HorizontalRule { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> HorizontalRule { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> HorizontalRule { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> HorizontalRule { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> HorizontalRule { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> HorizontalRule { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> HorizontalRule { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> HorizontalRule { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> HorizontalRule { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> HorizontalRule { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> HorizontalRule { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> HorizontalRule { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> HorizontalRule { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> HorizontalRule { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> HorizontalRule { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> HorizontalRule { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> HorizontalRule { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> HorizontalRule { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> HorizontalRule { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> HorizontalRule { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> HorizontalRule { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> HorizontalRule { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> HorizontalRule { + return mutate(key: key, value: .init(value, context: context)) } - public func custom(key: String, value: Any) -> HorizontalRule { - return mutate(key: key, value: value) + public func custom(key: String, value: Int) -> HorizontalRule { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> HorizontalRule { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> HorizontalRule { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> HorizontalRule { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> HorizontalRule { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> HorizontalRule { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> HorizontalRule { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> HorizontalRule { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> HorizontalRule { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> HorizontalRule { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> HorizontalRule { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> HorizontalRule { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> HorizontalRule { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> HorizontalRule { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> HorizontalRule { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> HorizontalRule { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> HorizontalRule { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> HorizontalRule { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> HorizontalRule { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> HorizontalRule { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> HorizontalRule { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> HorizontalRule { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> HorizontalRule { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> HorizontalRule { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> HorizontalRule { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> HorizontalRule { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> HorizontalRule { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> HorizontalRule { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> HorizontalRule { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -5465,7 +6297,7 @@ public struct PreformattedText: ContentNode, HtmlElement, BodyElement, FormEleme internal var name: String { "pre" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -5480,7 +6312,7 @@ public struct PreformattedText: ContentNode, HtmlElement, BodyElement, FormEleme self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -5509,272 +6341,324 @@ public struct PreformattedText: ContentNode, HtmlElement, BodyElement, FormEleme extension PreformattedText: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> PreformattedText { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> PreformattedText { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> PreformattedText { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> PreformattedText { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> PreformattedText { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> PreformattedText { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> PreformattedText { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> PreformattedText { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> PreformattedText { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> PreformattedText { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> PreformattedText { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> PreformattedText { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> PreformattedText { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> PreformattedText { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> PreformattedText { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> PreformattedText { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> PreformattedText { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> PreformattedText { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> PreformattedText { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> PreformattedText { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> PreformattedText { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> PreformattedText { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> PreformattedText { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> PreformattedText { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> PreformattedText { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> PreformattedText { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> PreformattedText { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> PreformattedText { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> PreformattedText { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> PreformattedText { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> PreformattedText { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> PreformattedText { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> PreformattedText { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> PreformattedText { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> PreformattedText { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> PreformattedText { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> PreformattedText { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> PreformattedText { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> PreformattedText { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> PreformattedText { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> PreformattedText { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> PreformattedText { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> PreformattedText { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> PreformattedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> PreformattedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> PreformattedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> PreformattedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> PreformattedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> PreformattedText { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> PreformattedText { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> PreformattedText { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> PreformattedText { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> PreformattedText { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> PreformattedText { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> PreformattedText { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> PreformattedText { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> PreformattedText { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> PreformattedText { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> PreformattedText { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> PreformattedText { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> PreformattedText { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> PreformattedText { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> PreformattedText { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> PreformattedText { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> PreformattedText { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> PreformattedText { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> PreformattedText { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -5791,7 +6675,7 @@ public struct Blockquote: ContentNode, HtmlElement, BodyElement, FormElement, Fi internal var name: String { "blockquote" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -5806,7 +6690,7 @@ public struct Blockquote: ContentNode, HtmlElement, BodyElement, FormElement, Fi self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -5835,276 +6719,328 @@ public struct Blockquote: ContentNode, HtmlElement, BodyElement, FormElement, Fi extension Blockquote: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, CiteAttribute { public func accessKey(_ value: Character) -> Blockquote { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Blockquote { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Blockquote { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Blockquote { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Blockquote { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Blockquote { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Blockquote { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Blockquote { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Blockquote { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Blockquote { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Blockquote { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Blockquote { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Blockquote { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Blockquote { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Blockquote { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Blockquote { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Blockquote { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Blockquote { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Blockquote { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Blockquote { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Blockquote { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Blockquote { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Blockquote { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Blockquote { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Blockquote { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Blockquote { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Blockquote { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Blockquote { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Blockquote { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Blockquote { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Blockquote { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Blockquote { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Blockquote { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Blockquote { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Blockquote { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func cite(_ value: String) -> Blockquote { - return mutate(cite: value) + return mutate(cite: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> Blockquote { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Blockquote { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Blockquote { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Blockquote { - return mutate(key: key, value: value) + public func custom(key: String, value: Double) -> Blockquote { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Blockquote { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Blockquote { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Blockquote { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Blockquote { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Blockquote { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Blockquote { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Blockquote { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Blockquote { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Blockquote { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Blockquote { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Blockquote { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Blockquote { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Blockquote { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Blockquote { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Blockquote { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Blockquote { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Blockquote { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Blockquote { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Blockquote { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Blockquote { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Blockquote { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Blockquote { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Blockquote { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Blockquote { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Blockquote { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Blockquote { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Blockquote { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -6135,7 +7071,7 @@ public struct OrderedList: ContentNode, HtmlElement, BodyElement, FormElement, F internal var name: String { "ol" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [ListElement] @@ -6150,7 +7086,7 @@ public struct OrderedList: ContentNode, HtmlElement, BodyElement, FormElement, F self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [ListElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [ListElement]) { self.attributes = attributes self.context = context @@ -6179,284 +7115,336 @@ public struct OrderedList: ContentNode, HtmlElement, BodyElement, FormElement, F extension OrderedList: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, ReversedAttribute, StartAttribute, TypeAttribute { public func accessKey(_ value: Character) -> OrderedList { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> OrderedList { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> OrderedList { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> OrderedList { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> OrderedList { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> OrderedList { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> OrderedList { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> OrderedList { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> OrderedList { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> OrderedList { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> OrderedList { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> OrderedList { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> OrderedList { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> OrderedList { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> OrderedList { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> OrderedList { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> OrderedList { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> OrderedList { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> OrderedList { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> OrderedList { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> OrderedList { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> OrderedList { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> OrderedList { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> OrderedList { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> OrderedList { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> OrderedList { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> OrderedList { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> OrderedList { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> OrderedList { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> OrderedList { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> OrderedList { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> OrderedList { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> OrderedList { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> OrderedList { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> OrderedList { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func reversed() -> OrderedList { - return mutate(reversed: "reversed") + return mutate(reversed: .init("reversed", context: .trusted)) } public func start(_ size: Int) -> OrderedList { - return mutate(start: size) + return mutate(start: .init(size, context: .trusted)) } public func type(_ value: Values.Marker) -> OrderedList { - return mutate(type: value.rawValue) + return mutate(type: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> OrderedList { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> OrderedList { - return mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> OrderedList { + return mutate(key: key, value: .init(value, context: context)) } - public func on(event: Events.Drag, _ value: String) -> OrderedList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + public func custom(key: String, value: Int) -> OrderedList { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> OrderedList { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> OrderedList { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> OrderedList { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> OrderedList { + return mutate(key: key, value: .init(value, context: context)) + } + + public func on(event: Events.Drag, _ value: String) -> OrderedList { + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> OrderedList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> OrderedList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> OrderedList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> OrderedList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> OrderedList { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> OrderedList { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> OrderedList { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> OrderedList { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> OrderedList { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> OrderedList { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> OrderedList { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> OrderedList { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> OrderedList { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> OrderedList { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> OrderedList { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> OrderedList { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> OrderedList { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> OrderedList { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> OrderedList { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> OrderedList { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> OrderedList { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> OrderedList { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> OrderedList { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -6478,7 +7466,7 @@ public struct UnorderedList: ContentNode, HtmlElement, BodyElement, FormElement, internal var name: String { "ul" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [ListElement] @@ -6493,7 +7481,7 @@ public struct UnorderedList: ContentNode, HtmlElement, BodyElement, FormElement, self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [ListElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [ListElement]) { self.attributes = attributes self.context = context @@ -6522,272 +7510,324 @@ public struct UnorderedList: ContentNode, HtmlElement, BodyElement, FormElement, extension UnorderedList: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> UnorderedList { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> UnorderedList { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> UnorderedList { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> UnorderedList { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> UnorderedList { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> UnorderedList { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> UnorderedList { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> UnorderedList { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> UnorderedList { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> UnorderedList { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> UnorderedList { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> UnorderedList { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> UnorderedList { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> UnorderedList { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> UnorderedList { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> UnorderedList { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> UnorderedList { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> UnorderedList { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> UnorderedList { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> UnorderedList { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> UnorderedList { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> UnorderedList { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> UnorderedList { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> UnorderedList { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> UnorderedList { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> UnorderedList { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> UnorderedList { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> UnorderedList { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> UnorderedList { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> UnorderedList { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> UnorderedList { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> UnorderedList { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> UnorderedList { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> UnorderedList { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> UnorderedList { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> UnorderedList { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> UnorderedList { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> UnorderedList { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> UnorderedList { - return mutate(key: key, value: value) + public func custom(key: String, value: Double) -> UnorderedList { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> UnorderedList { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> UnorderedList { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> UnorderedList { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> UnorderedList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> UnorderedList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> UnorderedList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> UnorderedList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> UnorderedList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> UnorderedList { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> UnorderedList { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> UnorderedList { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> UnorderedList { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> UnorderedList { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> UnorderedList { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> UnorderedList { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> UnorderedList { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> UnorderedList { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> UnorderedList { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> UnorderedList { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> UnorderedList { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> UnorderedList { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> UnorderedList { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> UnorderedList { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> UnorderedList { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> UnorderedList { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> UnorderedList { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> UnorderedList { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -6815,7 +7855,7 @@ public struct Menu: ContentNode, HtmlElement, BodyElement { internal var name: String { "menu" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [ListElement] @@ -6830,7 +7870,7 @@ public struct Menu: ContentNode, HtmlElement, BodyElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [ListElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [ListElement]) { self.attributes = attributes self.context = context @@ -6859,176 +7899,228 @@ public struct Menu: ContentNode, HtmlElement, BodyElement { extension Menu: GlobalAttributes { public func accessKey(_ value: Character) -> Menu { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Menu { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Menu { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Menu { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Menu { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Menu { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Menu { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Menu { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Menu { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Menu { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Menu { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Menu { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Menu { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Menu { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Menu { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Menu { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Menu { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Menu { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Menu { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Menu { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Menu { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Menu { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Menu { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Menu { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Menu { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Menu { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Menu { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Menu { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Menu { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Menu { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Menu { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Menu { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Menu { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Menu { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Menu { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Menu { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Menu { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Menu { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Menu { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Menu { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Menu { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Menu { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Menu { + return mutate(key: key, value: .init(value, context: context)) } } @@ -7052,7 +8144,7 @@ public struct DescriptionList: ContentNode, HtmlElement, BodyElement, FormElemen internal var name: String { "dl" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [DescriptionElement] @@ -7067,7 +8159,7 @@ public struct DescriptionList: ContentNode, HtmlElement, BodyElement, FormElemen self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [DescriptionElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [DescriptionElement]) { self.attributes = attributes self.context = context @@ -7096,272 +8188,324 @@ public struct DescriptionList: ContentNode, HtmlElement, BodyElement, FormElemen extension DescriptionList: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> DescriptionList { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> DescriptionList { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> DescriptionList { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> DescriptionList { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> DescriptionList { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> DescriptionList { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> DescriptionList { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> DescriptionList { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> DescriptionList { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> DescriptionList { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> DescriptionList { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> DescriptionList { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> DescriptionList { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> DescriptionList { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> DescriptionList { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> DescriptionList { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> DescriptionList { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> DescriptionList { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> DescriptionList { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> DescriptionList { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> DescriptionList { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> DescriptionList { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> DescriptionList { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> DescriptionList { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> DescriptionList { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> DescriptionList { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> DescriptionList { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> DescriptionList { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> DescriptionList { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> DescriptionList { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> DescriptionList { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> DescriptionList { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> DescriptionList { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> DescriptionList { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> DescriptionList { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> DescriptionList { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> DescriptionList { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> DescriptionList { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> DescriptionList { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> DescriptionList { - return mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> DescriptionList { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> DescriptionList { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> DescriptionList { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> DescriptionList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> DescriptionList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> DescriptionList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> DescriptionList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> DescriptionList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> DescriptionList { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> DescriptionList { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> DescriptionList { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> DescriptionList { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> DescriptionList { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> DescriptionList { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> DescriptionList { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> DescriptionList { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> DescriptionList { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> DescriptionList { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> DescriptionList { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> DescriptionList { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> DescriptionList { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> DescriptionList { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> DescriptionList { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> DescriptionList { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> DescriptionList { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> DescriptionList { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> DescriptionList { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -7383,7 +8527,7 @@ public struct Figure: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var name: String { "figure" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [FigureElement] @@ -7398,7 +8542,7 @@ public struct Figure: ContentNode, HtmlElement, BodyElement, FormElement, Figure self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [FigureElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [FigureElement]) { self.attributes = attributes self.context = context @@ -7427,272 +8571,324 @@ public struct Figure: ContentNode, HtmlElement, BodyElement, FormElement, Figure extension Figure: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Figure { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Figure { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Figure { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Figure { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Figure { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Figure { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Figure { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Figure { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Figure { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Figure { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Figure { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Figure { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Figure { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Figure { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Figure { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Figure { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Figure { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Figure { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Figure { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Figure { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Figure { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Figure { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Figure { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Figure { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Figure { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Figure { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Figure { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Figure { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Figure { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Figure { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Figure { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Figure { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Figure { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Figure { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Figure { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Figure { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Figure { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Figure { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Figure { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Figure { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Figure { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Figure { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Figure { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Figure { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Figure { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Figure { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Figure { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Figure { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Figure { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Figure { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Figure { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Figure { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Figure { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Figure { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Figure { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Figure { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Figure { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Figure { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Figure { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Figure { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Figure { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Figure { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Figure { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Figure { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Figure { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Figure { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Figure { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -7711,7 +8907,7 @@ public struct Anchor: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var name: String { "a" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -7726,7 +8922,7 @@ public struct Anchor: ContentNode, HtmlElement, BodyElement, FormElement, Figure self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -7755,316 +8951,368 @@ public struct Anchor: ContentNode, HtmlElement, BodyElement, FormElement, Figure extension Anchor: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, DownloadAttribute, ReferenceAttribute, ReferenceLanguageAttribute, MediaAttribute, PingAttribute, ReferrerPolicyAttribute, RelationshipAttribute, TargetAttribute, TypeAttribute { public func accessKey(_ value: Character) -> Anchor { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Anchor { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Anchor { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Anchor { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Anchor { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Anchor { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Anchor { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Anchor { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Anchor { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Anchor { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Anchor { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Anchor { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Anchor { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Anchor { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Anchor { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Anchor { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Anchor { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Anchor { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Anchor { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Anchor { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Anchor { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Anchor { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Anchor { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Anchor { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Anchor { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Anchor { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Anchor { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Anchor { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Anchor { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Anchor { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Anchor { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Anchor { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Anchor { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Anchor { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Anchor { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func download() -> Anchor { - return mutate(download: "download") + return mutate(download: .init("download", context: .trusted)) } public func reference(_ value: String) -> Anchor { - return mutate(href: value) + return mutate(href: .init(value, context: .tainted(.url))) } public func referenceLanguage(_ value: Values.Language) -> Anchor { - return mutate(hreflang: value.rawValue) + return mutate(hreflang: .init(value.rawValue, context: .trusted)) } public func media(_ value: String) -> Anchor { - return mutate(media: value) + return mutate(media: .init(value, context: .tainted(.html))) } public func media(_ queries: [MediaQuery]) -> Anchor { - return mutate(media: queries.map { $0.rawValue }.joined(separator: ", ")) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func media(_ queries: MediaQuery...) -> Anchor { - return mutate(media: queries.map { $0.rawValue }.joined(separator: ", ")) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func ping(_ value: String) -> Anchor { - return mutate(ping: value) + return mutate(ping: .init(value, context: .tainted(.html))) } public func referrerPolicy(_ value: Values.Policy) -> Anchor { - return mutate(referrerpolicy: value.rawValue) + return mutate(referrerpolicy: .init(value.rawValue, context: .trusted)) } public func relationship(_ value: Values.Relation) -> Anchor { - return mutate(rel: value.rawValue) + return mutate(rel: .init(value.rawValue, context: .trusted)) } public func target(_ value: Values.Target) -> Anchor { - return mutate(target: value.rawValue) + return mutate(target: .init(value.rawValue, context: .trusted)) } public func type(_ value: String) -> Anchor { - return mutate(type: value) + return mutate(type: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> Anchor { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Anchor { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Anchor { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Anchor { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Anchor { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Anchor { - return mutate(key: key, value: value) + public func custom(key: String, value: Float) -> Anchor { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Anchor { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Anchor { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Anchor { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Anchor { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Anchor { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Anchor { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Anchor { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Anchor { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Anchor { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Anchor { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Anchor { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Anchor { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Anchor { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Anchor { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Anchor { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Anchor { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Anchor { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Anchor { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Anchor { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Anchor { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Anchor { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Anchor { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Anchor { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Anchor { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Anchor { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -8094,7 +9342,7 @@ public struct Emphasize: ContentNode, HtmlElement, BodyElement, FormElement, Fig internal var name: String { "em" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -8109,7 +9357,7 @@ public struct Emphasize: ContentNode, HtmlElement, BodyElement, FormElement, Fig self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -8138,272 +9386,324 @@ public struct Emphasize: ContentNode, HtmlElement, BodyElement, FormElement, Fig extension Emphasize: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Emphasize { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Emphasize { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Emphasize { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Emphasize { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Emphasize { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Emphasize { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Emphasize { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Emphasize { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Emphasize { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Emphasize { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Emphasize { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Emphasize { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Emphasize { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Emphasize { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Emphasize { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Emphasize { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Emphasize { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Emphasize { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Emphasize { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Emphasize { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Emphasize { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Emphasize { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Emphasize { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Emphasize { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Emphasize { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Emphasize { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Emphasize { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Emphasize { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Emphasize { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Emphasize { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Emphasize { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Emphasize { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Emphasize { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Emphasize { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Emphasize { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Emphasize { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Emphasize { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Emphasize { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Emphasize { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Emphasize { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Emphasize { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Emphasize { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Emphasize { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Emphasize { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Emphasize { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Emphasize { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Emphasize { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Emphasize { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Emphasize { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Emphasize { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Emphasize { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Emphasize { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Emphasize { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Emphasize { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Emphasize { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Emphasize { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Emphasize { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Emphasize { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Emphasize { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Emphasize { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Emphasize { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Emphasize { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Emphasize { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Emphasize { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Emphasize { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Emphasize { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Emphasize { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -8422,7 +9722,7 @@ public struct Strong: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var name: String { "strong" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -8437,7 +9737,7 @@ public struct Strong: ContentNode, HtmlElement, BodyElement, FormElement, Figure self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -8466,272 +9766,324 @@ public struct Strong: ContentNode, HtmlElement, BodyElement, FormElement, Figure extension Strong: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Strong { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Strong { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Strong { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Strong { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Strong { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Strong { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Strong { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Strong { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Strong { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Strong { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Strong { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Strong { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Strong { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Strong { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Strong { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Strong { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Strong { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Strong { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Strong { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Strong { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Strong { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Strong { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Strong { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Strong { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Strong { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Strong { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Strong { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Strong { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Strong { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Strong { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Strong { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Strong { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Strong { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Strong { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Strong { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Strong { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Strong { + return mutate(key: key, value: .init(value, context: context)) } - public func custom(key: String, value: Any) -> Strong { - return mutate(key: key, value: value) + public func custom(key: String, value: Int) -> Strong { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Strong { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Strong { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Strong { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Strong { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Strong { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Strong { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Strong { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Strong { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Strong { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Strong { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Strong { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Strong { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Strong { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Strong { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Strong { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Strong { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Strong { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Strong { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Strong { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Strong { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Strong { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Strong { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Strong { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Strong { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Strong { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Strong { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Strong { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Strong { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -8750,7 +10102,7 @@ public struct Small: ContentNode, HtmlElement, BodyElement, FormElement, FigureE internal var name: String { "small" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -8765,7 +10117,7 @@ public struct Small: ContentNode, HtmlElement, BodyElement, FormElement, FigureE self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -8794,272 +10146,324 @@ public struct Small: ContentNode, HtmlElement, BodyElement, FormElement, FigureE extension Small: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Small { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Small { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Small { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Small { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Small { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Small { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Small { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } public func draggable(_ value: Bool = true) -> Small { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Small { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Small { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Small { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Small { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Small { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Small { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Small { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Small { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Small { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Small { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Small { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Small { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Small { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Small { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Small { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Small { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Small { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Small { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Small { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Small { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Small { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Small { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Small { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Small { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Small { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Small { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Small { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Small { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Small { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Small { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Small { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Small { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Small { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Small { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Small { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Small { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Small { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Small { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Small { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Small { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Small { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Small { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Small { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Small { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Small { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Small { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Small { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Small { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Small { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Small { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Small { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Small { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Small { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Small { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Small { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Small { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Small { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Small { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Small { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -9087,7 +10491,7 @@ public struct StrikeThrough: ContentNode, HtmlElement, BodyElement, FormElement, internal var name: String { "s" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -9102,7 +10506,7 @@ public struct StrikeThrough: ContentNode, HtmlElement, BodyElement, FormElement, self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -9131,196 +10535,248 @@ public struct StrikeThrough: ContentNode, HtmlElement, BodyElement, FormElement, extension StrikeThrough: GlobalAttributes, GlobalEventAttributes { public func accessKey(_ value: Character) -> StrikeThrough { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> StrikeThrough { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> StrikeThrough { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> StrikeThrough { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> StrikeThrough { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> StrikeThrough { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> StrikeThrough { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> StrikeThrough { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> StrikeThrough { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> StrikeThrough { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> StrikeThrough { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> StrikeThrough { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> StrikeThrough { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> StrikeThrough { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> StrikeThrough { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> StrikeThrough { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> StrikeThrough { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> StrikeThrough { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> StrikeThrough { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> StrikeThrough { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> StrikeThrough { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> StrikeThrough { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> StrikeThrough { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> StrikeThrough { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> StrikeThrough { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> StrikeThrough { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> StrikeThrough { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> StrikeThrough { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> StrikeThrough { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> StrikeThrough { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> StrikeThrough { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> StrikeThrough { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> StrikeThrough { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> StrikeThrough { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> StrikeThrough { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> StrikeThrough { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> StrikeThrough { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> StrikeThrough { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> StrikeThrough { - return mutate(key: key, value: value) + public func custom(key: String, value: Double) -> StrikeThrough { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> StrikeThrough { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> StrikeThrough { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> StrikeThrough { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> StrikeThrough { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> StrikeThrough { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> StrikeThrough { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> StrikeThrough { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> StrikeThrough { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -9356,7 +10812,7 @@ public struct Main: ContentNode, HtmlElement, BodyElement, FormElement { internal var name: String { "main" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -9371,7 +10827,7 @@ public struct Main: ContentNode, HtmlElement, BodyElement, FormElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -9400,272 +10856,324 @@ public struct Main: ContentNode, HtmlElement, BodyElement, FormElement { extension Main: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Main { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Main { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Main { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Main { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Main { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Main { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Main { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Main { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Main { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Main { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Main { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Main { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Main { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Main { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Main { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) - } - + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy + } + public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Main { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Main { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Main { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Main { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Main { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Main { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Main { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Main { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Main { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Main { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Main { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Main { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Main { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Main { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Main { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Main { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Main { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Main { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Main { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Main { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Main { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Main { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Main { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Main { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Main { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Main { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Main { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Main { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Main { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Main { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Main { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Main { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Main { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Main { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Main { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Main { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Main { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Main { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Main { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Main { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Main { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Main { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Main { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Main { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Main { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Main { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Main { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Main { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Main { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Main { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Main { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Main { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -9689,7 +11197,7 @@ public struct Search: ContentNode, HtmlElement, BodyElement { internal var name: String { "search" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -9704,7 +11212,7 @@ public struct Search: ContentNode, HtmlElement, BodyElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -9733,176 +11241,228 @@ public struct Search: ContentNode, HtmlElement, BodyElement { extension Search: GlobalAttributes { public func accessKey(_ value: Character) -> Search { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Search { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Search { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Search { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Search { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Search { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Search { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Search { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Search { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Search { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Search { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Search { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Search { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Search { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Search { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Search { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Search { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Search { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Search { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Search { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Search { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Search { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Search { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Search { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Search { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Search { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Search { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Search { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Search { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Search { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Search { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Search { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Search { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Search { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Search { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Search { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Search { + return mutate(key: key, value: .init(value, context: context)) } - public func custom(key: String, value: Any) -> Search { - return mutate(key: key, value: value) + public func custom(key: String, value: Int) -> Search { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Search { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Search { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Search { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Search { + return mutate(key: key, value: .init(value, context: context)) } } @@ -9919,7 +11479,7 @@ public struct Division: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var name: String { "div" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -9934,7 +11494,7 @@ public struct Division: ContentNode, HtmlElement, BodyElement, FormElement, Figu self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -9963,272 +11523,324 @@ public struct Division: ContentNode, HtmlElement, BodyElement, FormElement, Figu extension Division: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Division { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Division { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Division { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Division { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Division { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Division { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Division { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Division { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Division { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Division { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Division { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Division { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Division { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Division { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Division { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Division { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Division { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Division { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Division { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Division { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Division { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Division { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Division { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Division { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Division { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Division { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Division { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Division { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Division { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Division { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Division { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Division { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Division { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Division { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Division { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Division { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Division { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Division { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Division { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Division { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Division { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Division { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Division { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Division { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Division { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Division { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Division { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Division { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Division { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Division { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Division { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Division { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Division { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Division { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Division { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Division { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Division { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Division { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Division { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Division { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Division { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Division { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Division { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Division { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Division { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Division { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Division { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -10250,7 +11862,7 @@ public struct Definition: ContentNode, HtmlElement, BodyElement, FormElement, Fi internal var name: String { "dfn" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -10265,7 +11877,7 @@ public struct Definition: ContentNode, HtmlElement, BodyElement, FormElement, Fi self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -10294,272 +11906,324 @@ public struct Definition: ContentNode, HtmlElement, BodyElement, FormElement, Fi extension Definition: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Definition { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Definition { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Definition { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Definition { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Definition { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Definition { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Definition { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Definition { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Definition { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Definition { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Definition { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Definition { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Definition { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Definition { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Definition { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Definition { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Definition { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Definition { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Definition { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Definition { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Definition { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Definition { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Definition { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Definition { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Definition { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Definition { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Definition { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Definition { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Definition { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Definition { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Definition { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Definition { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Definition { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Definition { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Definition { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Definition { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Definition { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Definition { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Definition { - return mutate(key: key, value: value) + public func custom(key: String, value: Double) -> Definition { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Definition { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Definition { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Definition { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Definition { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Definition { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Definition { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Definition { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Definition { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Definition { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Definition { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Definition { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Definition { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Definition { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Definition { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Definition { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Definition { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Definition { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Definition { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Definition { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Definition { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Definition { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Definition { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Definition { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Definition { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Definition { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Definition { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Definition { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -10579,7 +12243,7 @@ public struct Cite: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var name: String { "cite" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -10594,7 +12258,7 @@ public struct Cite: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -10623,272 +12287,324 @@ public struct Cite: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl extension Cite: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Cite { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Cite { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Cite { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Cite { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Cite { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Cite { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Cite { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Cite { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Cite { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Cite { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Cite { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Cite { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Cite { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Cite { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Cite { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Cite { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Cite { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Cite { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Cite { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Cite { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Cite { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Cite { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Cite { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Cite { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Cite { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Cite { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Cite { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Cite { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Cite { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Cite { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Cite { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Cite { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Cite { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Cite { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Cite { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Cite { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Cite { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Cite { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Cite { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Cite { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Cite { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Cite { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Cite { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Cite { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Cite { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Cite { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Cite { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Cite { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Cite { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Cite { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Cite { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Cite { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Cite { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Cite { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Cite { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Cite { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Cite { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Cite { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Cite { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Cite { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Cite { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Cite { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Cite { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Cite { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Cite { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Cite { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Cite { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -10907,7 +12623,7 @@ public struct ShortQuote: ContentNode, HtmlElement, BodyElement, FormElement, Fi internal var name: String { "q" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -10922,7 +12638,7 @@ public struct ShortQuote: ContentNode, HtmlElement, BodyElement, FormElement, Fi self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -10951,276 +12667,328 @@ public struct ShortQuote: ContentNode, HtmlElement, BodyElement, FormElement, Fi extension ShortQuote: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, CiteAttribute { public func accessKey(_ value: Character) -> ShortQuote { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> ShortQuote { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> ShortQuote { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> ShortQuote { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> ShortQuote { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> ShortQuote { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> ShortQuote { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> ShortQuote { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> ShortQuote { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> ShortQuote { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> ShortQuote { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> ShortQuote { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> ShortQuote { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> ShortQuote { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> ShortQuote { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> ShortQuote { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> ShortQuote { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> ShortQuote { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> ShortQuote { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> ShortQuote { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> ShortQuote { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> ShortQuote { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> ShortQuote { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> ShortQuote { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> ShortQuote { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> ShortQuote { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> ShortQuote { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> ShortQuote { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> ShortQuote { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> ShortQuote { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> ShortQuote { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> ShortQuote { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> ShortQuote { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> ShortQuote { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> ShortQuote { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func cite(_ value: String) -> ShortQuote { - return mutate(cite: value) + return mutate(cite: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> ShortQuote { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> ShortQuote { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> ShortQuote { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> ShortQuote { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> ShortQuote { - return mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> ShortQuote { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> ShortQuote { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> ShortQuote { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> ShortQuote { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> ShortQuote { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> ShortQuote { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> ShortQuote { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> ShortQuote { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> ShortQuote { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> ShortQuote { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> ShortQuote { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> ShortQuote { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> ShortQuote { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> ShortQuote { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> ShortQuote { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> ShortQuote { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> ShortQuote { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> ShortQuote { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> ShortQuote { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> ShortQuote { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> ShortQuote { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> ShortQuote { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> ShortQuote { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> ShortQuote { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> ShortQuote { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> ShortQuote { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> ShortQuote { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -11240,7 +13008,7 @@ public struct Abbreviation: ContentNode, HtmlElement, BodyElement, FormElement, internal var name: String { "abbr" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -11255,7 +13023,7 @@ public struct Abbreviation: ContentNode, HtmlElement, BodyElement, FormElement, self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -11284,272 +13052,324 @@ public struct Abbreviation: ContentNode, HtmlElement, BodyElement, FormElement, extension Abbreviation: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Abbreviation { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Abbreviation { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Abbreviation { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Abbreviation { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Abbreviation { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Abbreviation { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Abbreviation { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Abbreviation { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Abbreviation { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Abbreviation { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Abbreviation { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Abbreviation { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Abbreviation { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Abbreviation { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Abbreviation { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Abbreviation { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Abbreviation { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Abbreviation { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Abbreviation { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Abbreviation { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Abbreviation { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Abbreviation { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Abbreviation { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Abbreviation { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Abbreviation { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Abbreviation { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Abbreviation { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Abbreviation { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Abbreviation { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Abbreviation { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Abbreviation { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Abbreviation { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Abbreviation { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Abbreviation { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Abbreviation { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Abbreviation { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Abbreviation { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Abbreviation { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Abbreviation { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Abbreviation { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Abbreviation { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Abbreviation { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Abbreviation { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Abbreviation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Abbreviation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Abbreviation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Abbreviation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Abbreviation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Abbreviation { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Abbreviation { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Abbreviation { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Abbreviation { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Abbreviation { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Abbreviation { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Abbreviation { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Abbreviation { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Abbreviation { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Abbreviation { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Abbreviation { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Abbreviation { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Abbreviation { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Abbreviation { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Abbreviation { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Abbreviation { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Abbreviation { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Abbreviation { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Abbreviation { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -11569,7 +13389,7 @@ public struct Ruby: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var name: String { "ruby" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [RubyElement] @@ -11584,7 +13404,7 @@ public struct Ruby: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [RubyElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [RubyElement]) { self.attributes = attributes self.context = context @@ -11613,272 +13433,324 @@ public struct Ruby: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl extension Ruby: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Ruby { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Ruby { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Ruby { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Ruby { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Ruby { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Ruby { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Ruby { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Ruby { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Ruby { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Ruby { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Ruby { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Ruby { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Ruby { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Ruby { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Ruby { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Ruby { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Ruby { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Ruby { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Ruby { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Ruby { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Ruby { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Ruby { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Ruby { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Ruby { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Ruby { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Ruby { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Ruby { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Ruby { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Ruby { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Ruby { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Ruby { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Ruby { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Ruby { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Ruby { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Ruby { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Ruby { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> Ruby { - return mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Ruby { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Ruby { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Ruby { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Ruby { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Ruby { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Ruby { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Ruby { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Ruby { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Ruby { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Ruby { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Ruby { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Ruby { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Ruby { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Ruby { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Ruby { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Ruby { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Ruby { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Ruby { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Ruby { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Ruby { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Ruby { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Ruby { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Ruby { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Ruby { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Ruby { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Ruby { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Ruby { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Ruby { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Ruby { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Ruby { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -11900,7 +13772,7 @@ public struct Data: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var name: String { "data" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -11915,7 +13787,7 @@ public struct Data: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -11944,165 +13816,197 @@ public struct Data: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl extension Data: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, ValueAttribute { public func accessKey(_ value: Character) -> Data { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Data { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Data { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Data { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Data { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Data { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Data { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Data { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Data { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Data { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Data { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Data { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Data { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Data { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Data { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Data { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Data { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Data { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Data { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Data { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Data { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Data { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Data { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Data { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Data { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Data { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Data { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Data { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Data { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Data { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Data { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Data { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Data { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Data { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Data { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self @@ -12110,119 +14014,139 @@ extension Data: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, V @_disfavoredOverload public func value(_ value: String) -> Data { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func value(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Data { - return mutate(value: LocalizedString(key: localizedKey, table: tableName)) + return mutate(value: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func value(verbatim value: String) -> Data { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> Data { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Data { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Data { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Data { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Data { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Data { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Data { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Data { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Data { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Data { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Data { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Data { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Data { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Data { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Data { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Data { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Data { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Data { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Data { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Data { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Data { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Data { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Data { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Data { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Data { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Data { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Data { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Data { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Data { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Data { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Data { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Data { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -12243,7 +14167,7 @@ public struct Time: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var name: String { "time" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -12258,7 +14182,7 @@ public struct Time: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -12287,276 +14211,328 @@ public struct Time: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl extension Time: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, DateTimeAttribute { public func accessKey(_ value: Character) -> Time { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Time { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Time { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Time { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Time { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Time { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Time { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Time { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Time { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Time { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Time { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Time { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Time { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Time { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Time { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Time { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) - } - @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy + } + + @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Time { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Time { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Time { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Time { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Time { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Time { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Time { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Time { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Time { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Time { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Time { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Time { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Time { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Time { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Time { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Time { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Time { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Time { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Time { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func dateTime(_ value: String) -> Time { - return mutate(datetime: value) + return mutate(datetime: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> Time { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Time { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Time { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Time { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Time { - return mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> Time { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Time { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Time { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Time { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Time { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Time { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Time { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Time { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Time { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Time { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Time { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Time { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Time { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Time { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Time { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Time { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Time { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Time { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Time { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Time { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Time { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Time { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Time { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Time { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Time { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Time { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Time { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -12577,7 +14553,7 @@ public struct Code: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var name: String { "code" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -12592,7 +14568,7 @@ public struct Code: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -12621,272 +14597,324 @@ public struct Code: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl extension Code: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Code { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Code { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Code { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Code { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Code { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Code { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Code { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Code { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Code { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Code { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Code { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Code { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Code { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Code { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Code { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Code { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Code { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Code { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Code { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Code { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Code { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Code { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Code { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Code { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Code { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Code { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Code { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Code { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Code { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Code { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Code { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Code { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Code { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Code { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Code { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Code { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Code { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Code { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Code { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Code { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Code { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Code { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Code { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Code { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Code { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Code { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Code { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Code { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Code { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Code { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Code { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Code { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Code { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Code { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Code { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Code { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Code { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Code { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Code { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Code { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Code { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Code { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Code { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Code { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Code { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Code { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Code { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -12907,7 +14935,7 @@ public struct Variable: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var name: String { "var" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -12922,7 +14950,7 @@ public struct Variable: ContentNode, HtmlElement, BodyElement, FormElement, Figu self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -12951,272 +14979,324 @@ public struct Variable: ContentNode, HtmlElement, BodyElement, FormElement, Figu extension Variable: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Variable { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Variable { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Variable { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Variable { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Variable { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Variable { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Variable { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Variable { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Variable { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Variable { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Variable { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Variable { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Variable { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Variable { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Variable { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Variable { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Variable { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Variable { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Variable { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Variable { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Variable { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Variable { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Variable { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Variable { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Variable { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Variable { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Variable { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Variable { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Variable { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Variable { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Variable { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Variable { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Variable { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Variable { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Variable { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Variable { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> Variable { - return mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Variable { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Variable { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Variable { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Variable { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Variable { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Variable { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Variable { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Variable { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Variable { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Variable { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Variable { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Variable { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Variable { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Variable { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Variable { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Variable { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Variable { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Variable { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Variable { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Variable { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Variable { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Variable { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Variable { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Variable { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Variable { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Variable { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Variable { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Variable { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Variable { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Variable { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -13233,7 +15313,7 @@ public struct SampleOutput: ContentNode, HtmlElement, BodyElement, FormElement, internal var name: String { "samp" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -13248,7 +15328,7 @@ public struct SampleOutput: ContentNode, HtmlElement, BodyElement, FormElement, self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -13277,272 +15357,324 @@ public struct SampleOutput: ContentNode, HtmlElement, BodyElement, FormElement, extension SampleOutput: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> SampleOutput { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> SampleOutput { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> SampleOutput { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> SampleOutput { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> SampleOutput { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> SampleOutput { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> SampleOutput { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> SampleOutput { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> SampleOutput { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> SampleOutput { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> SampleOutput { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> SampleOutput { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> SampleOutput { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> SampleOutput { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> SampleOutput { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> SampleOutput { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> SampleOutput { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> SampleOutput { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> SampleOutput { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> SampleOutput { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> SampleOutput { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> SampleOutput { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> SampleOutput { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> SampleOutput { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> SampleOutput { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> SampleOutput { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> SampleOutput { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> SampleOutput { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> SampleOutput { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> SampleOutput { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> SampleOutput { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> SampleOutput { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> SampleOutput { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> SampleOutput { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> SampleOutput { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> SampleOutput { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> SampleOutput { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> SampleOutput { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> SampleOutput { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> SampleOutput { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> SampleOutput { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> SampleOutput { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> SampleOutput { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> SampleOutput { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> SampleOutput { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> SampleOutput { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> SampleOutput { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> SampleOutput { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> SampleOutput { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> SampleOutput { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> SampleOutput { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> SampleOutput { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> SampleOutput { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> SampleOutput { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> SampleOutput { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> SampleOutput { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> SampleOutput { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> SampleOutput { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> SampleOutput { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> SampleOutput { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> SampleOutput { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> SampleOutput { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> SampleOutput { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> SampleOutput { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> SampleOutput { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> SampleOutput { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> SampleOutput { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -13563,7 +15695,7 @@ public struct KeyboardInput: ContentNode, HtmlElement, BodyElement, FormElement, internal var name: String { "kbd" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -13578,7 +15710,7 @@ public struct KeyboardInput: ContentNode, HtmlElement, BodyElement, FormElement, self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -13607,272 +15739,324 @@ public struct KeyboardInput: ContentNode, HtmlElement, BodyElement, FormElement, extension KeyboardInput: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> KeyboardInput { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> KeyboardInput { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> KeyboardInput { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> KeyboardInput { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> KeyboardInput { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> KeyboardInput { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> KeyboardInput { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> KeyboardInput { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> KeyboardInput { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> KeyboardInput { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> KeyboardInput { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> KeyboardInput { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> KeyboardInput { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> KeyboardInput { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> KeyboardInput { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> KeyboardInput { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> KeyboardInput { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> KeyboardInput { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> KeyboardInput { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> KeyboardInput { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> KeyboardInput { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> KeyboardInput { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> KeyboardInput { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> KeyboardInput { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> KeyboardInput { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> KeyboardInput { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> KeyboardInput { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> KeyboardInput { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> KeyboardInput { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> KeyboardInput { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> KeyboardInput { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> KeyboardInput { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> KeyboardInput { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> KeyboardInput { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> KeyboardInput { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> KeyboardInput { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> KeyboardInput { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> KeyboardInput { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> KeyboardInput { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> KeyboardInput { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> KeyboardInput { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> KeyboardInput { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> KeyboardInput { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> KeyboardInput { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> KeyboardInput { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> KeyboardInput { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> KeyboardInput { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> KeyboardInput { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> KeyboardInput { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> KeyboardInput { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> KeyboardInput { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> KeyboardInput { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> KeyboardInput { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> KeyboardInput { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> KeyboardInput { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> KeyboardInput { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> KeyboardInput { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> KeyboardInput { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> KeyboardInput { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> KeyboardInput { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> KeyboardInput { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> KeyboardInput { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> KeyboardInput { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> KeyboardInput { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> KeyboardInput { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> KeyboardInput { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> KeyboardInput { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -13893,7 +16077,7 @@ public struct Subscript: ContentNode, HtmlElement, BodyElement, FormElement, Fig internal var name: String { "sub" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -13908,7 +16092,7 @@ public struct Subscript: ContentNode, HtmlElement, BodyElement, FormElement, Fig self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -13937,271 +16121,323 @@ public struct Subscript: ContentNode, HtmlElement, BodyElement, FormElement, Fig extension Subscript: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Subscript { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Subscript { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Subscript { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Subscript { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Subscript { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Subscript { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Subscript { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Subscript { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Subscript { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Subscript { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Subscript { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Subscript { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Subscript { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Subscript { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Subscript { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Subscript { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Subscript { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Subscript { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Subscript { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Subscript { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Subscript { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Subscript { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Subscript { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Subscript { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Subscript { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Subscript { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Subscript { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Subscript { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Subscript { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Subscript { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Subscript { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Subscript { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Subscript { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Subscript { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Subscript { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Subscript { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Subscript { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Subscript { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Subscript { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Subscript { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Subscript { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Subscript { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Subscript { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Subscript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Subscript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Subscript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Subscript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Subscript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Subscript { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Subscript { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Subscript { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Subscript { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Subscript { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Subscript { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Subscript { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Subscript { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Subscript { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Subscript { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Subscript { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Subscript { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Subscript { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Subscript { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Subscript { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Subscript { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Subscript { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Subscript { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Subscript { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -14222,7 +16458,7 @@ public struct Superscript: ContentNode, HtmlElement, BodyElement, FormElement, F internal var name: String { "sup" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -14237,7 +16473,7 @@ public struct Superscript: ContentNode, HtmlElement, BodyElement, FormElement, F self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -14266,272 +16502,324 @@ public struct Superscript: ContentNode, HtmlElement, BodyElement, FormElement, F extension Superscript: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Superscript { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Superscript { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Superscript { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Superscript { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Superscript { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Superscript { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Superscript { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Superscript { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Superscript { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Superscript { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Superscript { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Superscript { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Superscript { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Superscript { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Superscript { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Superscript { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Superscript { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Superscript { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Superscript { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Superscript { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Superscript { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Superscript { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Superscript { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Superscript { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Superscript { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Superscript { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Superscript { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Superscript { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Superscript { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Superscript { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Superscript { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Superscript { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Superscript { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Superscript { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Superscript { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Superscript { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Superscript { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Superscript { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Superscript { - return mutate(key: key, value: value) + public func custom(key: String, value: Double) -> Superscript { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Superscript { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Superscript { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Superscript { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Superscript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Superscript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Superscript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Superscript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Superscript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Superscript { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Superscript { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Superscript { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Superscript { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Superscript { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Superscript { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Superscript { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Superscript { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Superscript { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Superscript { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Superscript { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Superscript { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Superscript { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Superscript { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Superscript { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Superscript { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Superscript { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Superscript { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Superscript { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -14552,7 +16840,7 @@ public struct Italic: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var name: String { "i" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -14567,7 +16855,7 @@ public struct Italic: ContentNode, HtmlElement, BodyElement, FormElement, Figure self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -14596,272 +16884,324 @@ public struct Italic: ContentNode, HtmlElement, BodyElement, FormElement, Figure extension Italic: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Italic { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Italic { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Italic { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Italic { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Italic { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Italic { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Italic { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Italic { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Italic { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Italic { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Italic { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Italic { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Italic { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Italic { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Italic { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Italic { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Italic { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Italic { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Italic { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Italic { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Italic { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Italic { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Italic { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Italic { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Italic { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Italic { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Italic { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Italic { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Italic { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Italic { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Italic { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Italic { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Italic { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Italic { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Italic { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Italic { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Italic { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Italic { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Italic { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Italic { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Italic { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Italic { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Italic { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Italic { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Italic { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Italic { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Italic { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Italic { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Italic { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Italic { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Italic { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Italic { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Italic { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Italic { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Italic { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Italic { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Italic { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Italic { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Italic { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Italic { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Italic { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Italic { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Italic { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Italic { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Italic { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Italic { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Italic { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -14891,7 +17231,7 @@ public struct Bold: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var name: String { "b" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -14906,7 +17246,7 @@ public struct Bold: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -14935,272 +17275,324 @@ public struct Bold: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl extension Bold: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Bold { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Bold { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Bold { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Bold { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Bold { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Bold { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Bold { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Bold { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Bold { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Bold { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Bold { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Bold { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Bold { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Bold { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Bold { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Bold { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Bold { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Bold { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Bold { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Bold { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Bold { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Bold { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Bold { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Bold { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Bold { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Bold { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Bold { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Bold { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Bold { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Bold { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Bold { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Bold { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Bold { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Bold { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Bold { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Bold { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Bold { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Bold { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Bold { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Bold { - return mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> Bold { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Bold { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Bold { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Bold { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Bold { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Bold { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Bold { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Bold { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Bold { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Bold { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Bold { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Bold { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Bold { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Bold { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Bold { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Bold { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Bold { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Bold { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Bold { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Bold { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Bold { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Bold { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Bold { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Bold { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Bold { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Bold { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Bold { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -15230,7 +17622,7 @@ public struct Underline: ContentNode, HtmlElement, BodyElement, FormElement, Fig internal var name: String { "u" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -15245,7 +17637,7 @@ public struct Underline: ContentNode, HtmlElement, BodyElement, FormElement, Fig self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -15274,272 +17666,324 @@ public struct Underline: ContentNode, HtmlElement, BodyElement, FormElement, Fig extension Underline: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Underline { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Underline { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Underline { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Underline { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Underline { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Underline { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Underline { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Underline { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Underline { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Underline { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Underline { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Underline { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Underline { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Underline { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Underline { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Underline { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Underline { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Underline { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Underline { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Underline { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Underline { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Underline { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Underline { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Underline { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Underline { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Underline { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Underline { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Underline { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Underline { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Underline { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Underline { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Underline { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Underline { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Underline { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Underline { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Underline { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> Underline { - return mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Underline { + return mutate(key: key, value: .init(value, context: context)) } - public func on(event: Events.Drag, _ value: String) -> Underline { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + public func custom(key: String, value: Int) -> Underline { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func on(event: Events.Clipboard, _ value: String) -> Underline { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + public func custom(key: String, value: Double) -> Underline { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func on(event: Events.Keyboard, _ value: String) -> Underline { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + public func custom(key: String, value: Bool) -> Underline { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Underline { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Underline { + return mutate(key: key, value: .init(value, context: context)) + } + + public func on(event: Events.Drag, _ value: String) -> Underline { + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) + } + + public func on(event: Events.Clipboard, _ value: String) -> Underline { + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) + } + + public func on(event: Events.Keyboard, _ value: String) -> Underline { + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Underline { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Underline { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Underline { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Underline { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Underline { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Underline { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Underline { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Underline { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Underline { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Underline { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Underline { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Underline { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Underline { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Underline { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Underline { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Underline { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Underline { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Underline { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Underline { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Underline { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Underline { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -15569,7 +18013,7 @@ public struct Mark: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var name: String { "mark" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -15584,7 +18028,7 @@ public struct Mark: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -15613,272 +18057,324 @@ public struct Mark: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl extension Mark: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Mark { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Mark { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Mark { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Mark { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Mark { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Mark { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Mark { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Mark { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Mark { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Mark { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Mark { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Mark { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Mark { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Mark { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Mark { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Mark { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Mark { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Mark { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Mark { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Mark { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Mark { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Mark { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Mark { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Mark { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Mark { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Mark { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Mark { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Mark { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Mark { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Mark { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Mark { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Mark { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Mark { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Mark { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Mark { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Mark { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Mark { + return mutate(key: key, value: .init(value, context: context)) } - public func custom(key: String, value: Any) -> Mark { - return mutate(key: key, value: value) + public func custom(key: String, value: Int) -> Mark { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Mark { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Mark { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Mark { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Mark { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Mark { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Mark { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Mark { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Mark { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Mark { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Mark { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Mark { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Mark { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Mark { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Mark { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Mark { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Mark { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Mark { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Mark { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Mark { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Mark { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Mark { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Mark { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Mark { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Mark { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Mark { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Mark { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Mark { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Mark { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -15899,7 +18395,7 @@ public struct Bdi: ContentNode, HtmlElement, BodyElement, FormElement, FigureEle internal var name: String { "bdi" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -15914,7 +18410,7 @@ public struct Bdi: ContentNode, HtmlElement, BodyElement, FormElement, FigureEle self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -15943,272 +18439,324 @@ public struct Bdi: ContentNode, HtmlElement, BodyElement, FormElement, FigureEle extension Bdi: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Bdi { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Bdi { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Bdi { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Bdi { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Bdi { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Bdi { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Bdi { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Bdi { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Bdi { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Bdi { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Bdi { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Bdi { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Bdi { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Bdi { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Bdi { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Bdi { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Bdi { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Bdi { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Bdi { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Bdi { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Bdi { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Bdi { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Bdi { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Bdi { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Bdi { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Bdi { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Bdi { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Bdi { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Bdi { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Bdi { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Bdi { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Bdi { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Bdi { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Bdi { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Bdi { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Bdi { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Bdi { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Bdi { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Bdi { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Bdi { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Bdi { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Bdi { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Bdi { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Bdi { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Bdi { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Bdi { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Bdi { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Bdi { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Bdi { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Bdi { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Bdi { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Bdi { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Bdi { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Bdi { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Bdi { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Bdi { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Bdi { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Bdi { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Bdi { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Bdi { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Bdi { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Bdi { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Bdi { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Bdi { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Bdi { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Bdi { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Bdi { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -16230,12 +18778,12 @@ public struct Bdo: EmptyNode, HtmlElement, BodyElement, FormElement, FigureEleme internal var name: String { "bdo" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Create a bidirectional override. public init() {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -16261,272 +18809,324 @@ public struct Bdo: EmptyNode, HtmlElement, BodyElement, FormElement, FigureEleme extension Bdo: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Bdo { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Bdo { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Bdo { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Bdo { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Bdo { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Bdo { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Bdo { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Bdo { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Bdo { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Bdo { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Bdo { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Bdo { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Bdo { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Bdo { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Bdo { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Bdo { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Bdo { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Bdo { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Bdo { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Bdo { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Bdo { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Bdo { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Bdo { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Bdo { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Bdo { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Bdo { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Bdo { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Bdo { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Bdo { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Bdo { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Bdo { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Bdo { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Bdo { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Bdo { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Bdo { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Bdo { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Bdo { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Bdo { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Bdo { - return mutate(key: key, value: value) + public func custom(key: String, value: Double) -> Bdo { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Bdo { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Bdo { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Bdo { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Bdo { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Bdo { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Bdo { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Bdo { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Bdo { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Bdo { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Bdo { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Bdo { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Bdo { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Bdo { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Bdo { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Bdo { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Bdo { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Bdo { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Bdo { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Bdo { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Bdo { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Bdo { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Bdo { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Bdo { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Bdo { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Bdo { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Bdo { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Bdo { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -16543,7 +19143,7 @@ public struct Span: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl internal var name: String { "span" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -16558,7 +19158,7 @@ public struct Span: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -16587,272 +19187,324 @@ public struct Span: ContentNode, HtmlElement, BodyElement, FormElement, FigureEl extension Span: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Span { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Span { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Span { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Span { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Span { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Span { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Span { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Span { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Span { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Span { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Span { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Span { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Span { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Span { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Span { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Span { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Span { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Span { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Span { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Span { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Span { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Span { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Span { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Span { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Span { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Span { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Span { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Span { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Span { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Span { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Span { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Span { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Span { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Span { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Span { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Span { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Span { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Span { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Span { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Span { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Span { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Span { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Span { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Span { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Span { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Span { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Span { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Span { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Span { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Span { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Span { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Span { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Span { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Span { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Span { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Span { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Span { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Span { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Span { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Span { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Span { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Span { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Span { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Span { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Span { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Span { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Span { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -16867,12 +19519,12 @@ public struct LineBreak: EmptyNode, HtmlElement, BodyElement, FormElement, Figur internal var name: String { "br" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Create a line break. public init() {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -16898,272 +19550,324 @@ public struct LineBreak: EmptyNode, HtmlElement, BodyElement, FormElement, Figur extension LineBreak: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> LineBreak { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> LineBreak { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> LineBreak { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> LineBreak { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> LineBreak { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> LineBreak { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> LineBreak { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> LineBreak { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> LineBreak { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> LineBreak { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> LineBreak { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> LineBreak { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> LineBreak { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> LineBreak { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> LineBreak { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> LineBreak { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> LineBreak { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> LineBreak { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> LineBreak { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> LineBreak { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> LineBreak { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> LineBreak { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> LineBreak { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> LineBreak { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> LineBreak { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> LineBreak { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> LineBreak { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> LineBreak { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> LineBreak { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> LineBreak { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> LineBreak { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> LineBreak { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> LineBreak { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> LineBreak { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> LineBreak { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> LineBreak { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> LineBreak { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> LineBreak { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> LineBreak { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> LineBreak { - return mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> LineBreak { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> LineBreak { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> LineBreak { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> LineBreak { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> LineBreak { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> LineBreak { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> LineBreak { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> LineBreak { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> LineBreak { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> LineBreak { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> LineBreak { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> LineBreak { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> LineBreak { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> LineBreak { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> LineBreak { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> LineBreak { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> LineBreak { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> LineBreak { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> LineBreak { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> LineBreak { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> LineBreak { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> LineBreak { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> LineBreak { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> LineBreak { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> LineBreak { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> LineBreak { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> LineBreak { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -17182,12 +19886,12 @@ public struct WordBreak: EmptyNode, HtmlElement, BodyElement, FormElement, Figur internal var name: String { "wbr" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Create a word break. public init() {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -17213,272 +19917,324 @@ public struct WordBreak: EmptyNode, HtmlElement, BodyElement, FormElement, Figur extension WordBreak: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> WordBreak { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> WordBreak { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> WordBreak { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> WordBreak { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> WordBreak { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> WordBreak { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> WordBreak { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> WordBreak { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> WordBreak { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> WordBreak { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> WordBreak { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> WordBreak { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> WordBreak { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> WordBreak { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> WordBreak { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> WordBreak { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> WordBreak { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> WordBreak { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> WordBreak { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> WordBreak { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> WordBreak { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> WordBreak { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> WordBreak { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> WordBreak { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> WordBreak { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> WordBreak { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> WordBreak { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> WordBreak { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> WordBreak { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> WordBreak { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> WordBreak { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> WordBreak { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> WordBreak { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> WordBreak { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> WordBreak { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> WordBreak { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> WordBreak { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> WordBreak { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> WordBreak { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> WordBreak { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> WordBreak { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> WordBreak { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> WordBreak { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> WordBreak { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> WordBreak { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> WordBreak { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> WordBreak { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> WordBreak { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> WordBreak { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> WordBreak { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> WordBreak { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> WordBreak { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> WordBreak { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> WordBreak { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> WordBreak { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> WordBreak { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> WordBreak { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> WordBreak { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> WordBreak { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> WordBreak { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> WordBreak { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> WordBreak { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> WordBreak { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> WordBreak { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> WordBreak { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> WordBreak { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> WordBreak { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -17495,7 +20251,7 @@ public struct InsertedText: ContentNode, HtmlElement, BodyElement, FormElement, internal var name: String { "ins" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -17510,7 +20266,7 @@ public struct InsertedText: ContentNode, HtmlElement, BodyElement, FormElement, self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -17539,280 +20295,332 @@ public struct InsertedText: ContentNode, HtmlElement, BodyElement, FormElement, extension InsertedText: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, CiteAttribute, DateTimeAttribute { public func accessKey(_ value: Character) -> InsertedText { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> InsertedText { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> InsertedText { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> InsertedText { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> InsertedText { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> InsertedText { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> InsertedText { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> InsertedText { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> InsertedText { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> InsertedText { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> InsertedText { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> InsertedText { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> InsertedText { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> InsertedText { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> InsertedText { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> InsertedText { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> InsertedText { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> InsertedText { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> InsertedText { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> InsertedText { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> InsertedText { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> InsertedText { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> InsertedText { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> InsertedText { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> InsertedText { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> InsertedText { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> InsertedText { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> InsertedText { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> InsertedText { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> InsertedText { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> InsertedText { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> InsertedText { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> InsertedText { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> InsertedText { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> InsertedText { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func cite(_ value: String) -> InsertedText { - return mutate(cite: value) + return mutate(cite: .init(value, context: .tainted(.html))) } public func dateTime(_ value: String) -> InsertedText { - return mutate(datetime: value) + return mutate(datetime: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> InsertedText { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> InsertedText { - return mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> InsertedText { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> InsertedText { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> InsertedText { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> InsertedText { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> InsertedText { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> InsertedText { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> InsertedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> InsertedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> InsertedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> InsertedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> InsertedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> InsertedText { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> InsertedText { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> InsertedText { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> InsertedText { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> InsertedText { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> InsertedText { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> InsertedText { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> InsertedText { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> InsertedText { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> InsertedText { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> InsertedText { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> InsertedText { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> InsertedText { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> InsertedText { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> InsertedText { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> InsertedText { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> InsertedText { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> InsertedText { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> InsertedText { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -17829,7 +20637,7 @@ public struct DeletedText: ContentNode, HtmlElement, BodyElement, FormElement, F internal var name: String { "del" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -17844,7 +20652,7 @@ public struct DeletedText: ContentNode, HtmlElement, BodyElement, FormElement, F self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -17873,280 +20681,332 @@ public struct DeletedText: ContentNode, HtmlElement, BodyElement, FormElement, F extension DeletedText: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, CiteAttribute, DateTimeAttribute { public func accessKey(_ value: Character) -> DeletedText { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> DeletedText { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> DeletedText { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> DeletedText { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> DeletedText { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> DeletedText { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> DeletedText { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> DeletedText { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> DeletedText { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> DeletedText { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> DeletedText { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> DeletedText { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> DeletedText { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> DeletedText { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> DeletedText { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> DeletedText { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> DeletedText { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> DeletedText { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> DeletedText { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> DeletedText { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> DeletedText { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> DeletedText { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> DeletedText { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> DeletedText { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> DeletedText { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> DeletedText { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> DeletedText { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> DeletedText { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> DeletedText { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> DeletedText { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> DeletedText { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> DeletedText { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> DeletedText { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> DeletedText { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> DeletedText { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func cite(_ value: String) -> DeletedText { - return mutate(cite: value) + return mutate(cite: .init(value, context: .tainted(.html))) } public func dateTime(_ value: String) -> DeletedText { - return mutate(datetime: value) + return mutate(datetime: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> DeletedText { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> DeletedText { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> DeletedText { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> DeletedText { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> DeletedText { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> DeletedText { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> DeletedText { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> DeletedText { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> DeletedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> DeletedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> DeletedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> DeletedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> DeletedText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> DeletedText { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> DeletedText { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> DeletedText { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> DeletedText { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> DeletedText { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> DeletedText { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> DeletedText { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> DeletedText { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> DeletedText { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> DeletedText { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> DeletedText { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> DeletedText { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> DeletedText { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> DeletedText { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> DeletedText { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> DeletedText { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> DeletedText { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> DeletedText { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> DeletedText { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -18168,7 +21028,7 @@ public struct Picture: ContentNode, HtmlElement, BodyElement, FormElement, Figur internal var name: String { "picture" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -18183,7 +21043,7 @@ public struct Picture: ContentNode, HtmlElement, BodyElement, FormElement, Figur self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -18212,196 +21072,248 @@ public struct Picture: ContentNode, HtmlElement, BodyElement, FormElement, Figur extension Picture: GlobalAttributes, GlobalEventAttributes { public func accessKey(_ value: Character) -> Picture { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Picture { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Picture { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Picture { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Picture { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Picture { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Picture { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Picture { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Picture { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Picture { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Picture { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Picture { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Picture { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Picture { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Picture { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Picture { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Picture { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Picture { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Picture { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Picture { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Picture { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Picture { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Picture { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Picture { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Picture { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Picture { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Picture { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Picture { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Picture { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Picture { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Picture { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Picture { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Picture { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Picture { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Picture { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Picture { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Picture { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Picture { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Picture { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Picture { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Picture { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Picture { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Picture { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Picture { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Picture { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Picture { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Picture { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Picture { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -18419,12 +21331,12 @@ public struct Image: EmptyNode, HtmlElement, BodyElement, FormElement, FigureEle internal var name: String { "img" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Create an image. public init() {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -18450,173 +21362,205 @@ public struct Image: EmptyNode, HtmlElement, BodyElement, FormElement, FigureEle extension Image: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, AlternateAttribute, SourceAttribute, SizesAttribute, WidthAttribute, HeightAttribute, ReferrerPolicyAttribute, FetchPriorityAttribute, LoadingAttribute, SourceSetAttribute, DecodingAttribute, IsMapAttribute, UseMapAttribute, CrossOriginAttribute { public func accessKey(_ value: Character) -> Image { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Image { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Image { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Image { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } public func crossOrigin(_ value: Credential.Mode) -> Image { - return mutate(crossorigin: value.rawValue) + return mutate(crossorigin: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Image { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Image { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Image { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Image { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Image { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Image { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Image { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Image { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Image { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Image { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Image { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Image { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Image { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Image { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Image { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Image { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Image { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Image { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func isMap() -> Image { - return mutate(ismap: "ismap") + return mutate(ismap: .init("ismap", context: .trusted)) } public func language(_ value: Values.Language) -> Image { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Image { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Image { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Image { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Image { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Image { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Image { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Image { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Image { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Image { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Image { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Image { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Image { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self @@ -18624,176 +21568,196 @@ extension Image: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, @_disfavoredOverload public func alternate(_ value: String) -> Image { - return mutate(alternate: value) + return mutate(alternate: .init(value, context: .tainted(.html))) } public func alternate(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Image { - return mutate(alternate: LocalizedString(key: localizedKey, table: tableName)) + return mutate(alternate: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func alternate(verbatim value: String) -> Image { - return mutate(alternate: value) + return mutate(alternate: .init(value, context: .tainted(.html))) } public func source(_ value: String) -> Image { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func source(_ value: EnvironmentValue) -> Image { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the sourceSet(_:) modifier instead.") public func sourceSet(_ value: String) -> Image { - return mutate(sourceset: value) + return mutate(sourceset: .init(value, context: .tainted(.html))) } public func sourceSet(_ candidates: [SourceCandidate]) -> Image { - return mutate(sourceset: candidates.map { $0.rawValue }.joined(separator: ", ")) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func sourceSet(_ candidates: SourceCandidate...) -> Image { - return mutate(sourceset: candidates.map { $0.rawValue }.joined(separator: ", ")) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func sizes(_ candidates: [SizeCandidate]) -> Image { - return mutate(sizes: candidates.map { $0.rawValue }.joined(separator: ", ")) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func sizes(_ candidates: SizeCandidate...) -> Image { - return mutate(sizes: candidates.map { $0.rawValue }.joined(separator: ", ")) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func width(_ size: Int) -> Image { - return mutate(width: size) + return mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> Image { - return mutate(height: size) + return mutate(height: .init(size, context: .trusted)) } public func referrerPolicy(_ value: Values.Policy) -> Image { - return mutate(referrerpolicy: value.rawValue) + return mutate(referrerpolicy: .init(value.rawValue, context: .trusted)) } public func fetchPriority(_ value: Values.Priority) -> Image { - return mutate(fetchpriority: value.rawValue) + return mutate(fetchpriority: .init(value.rawValue, context: .trusted)) } public func loading(_ value: Values.Loading) -> Image { - return mutate(loading: value.rawValue) + return mutate(loading: .init(value.rawValue, context: .trusted)) } public func decoding(_ value: Values.Decoding) -> Image { - return mutate(decoding: value.rawValue) + return mutate(decoding: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Image { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } public func useMap(_ value: String) -> Image { - return mutate(usemap: value) + return mutate(usemap: .init(value, context: .tainted(.html))) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Image { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Image { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Image { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Image { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Image { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Image { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Image { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Image { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Image { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Image { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Image { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Image { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Image { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Image { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Image { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Image { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Image { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Image { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Image { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Image { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Image { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Image { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Image { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Image { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Image { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Image { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Image { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Image { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Image { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Image { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Image { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -18811,7 +21775,7 @@ public struct InlineFrame: ContentNode, HtmlElement, BodyElement, FormElement, F internal var name: String { "iframe" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -18826,7 +21790,7 @@ public struct InlineFrame: ContentNode, HtmlElement, BodyElement, FormElement, F self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -18855,316 +21819,368 @@ public struct InlineFrame: ContentNode, HtmlElement, BodyElement, FormElement, F extension InlineFrame: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, SourceAttribute, NameAttribute, WidthAttribute, HeightAttribute, ReferrerPolicyAttribute, LoadingAttribute, SandboxAttribute, SourceDocumentAttribute { public func accessKey(_ value: Character) -> InlineFrame { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> InlineFrame { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> InlineFrame { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> InlineFrame { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> InlineFrame { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> InlineFrame { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> InlineFrame { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> InlineFrame { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> InlineFrame { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> InlineFrame { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> InlineFrame { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> InlineFrame { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> InlineFrame { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> InlineFrame { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> InlineFrame { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> InlineFrame { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> InlineFrame { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> InlineFrame { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> InlineFrame { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> InlineFrame { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> InlineFrame { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> InlineFrame { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> InlineFrame { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> InlineFrame { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> InlineFrame { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> InlineFrame { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> InlineFrame { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> InlineFrame { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> InlineFrame { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> InlineFrame { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> InlineFrame { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> InlineFrame { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> InlineFrame { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> InlineFrame { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> InlineFrame { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func sandbox() -> InlineFrame { - return mutate(sandbox: "sandbox") + return mutate(sandbox: .init("sandbox", context: .trusted)) } public func sandbox(_ value: Values.Permission) -> InlineFrame { - return mutate(sandbox: value.rawValue) + return mutate(sandbox: .init(value.rawValue, context: .trusted)) } public func sandbox(_ values: OrderedCollections.OrderedSet) -> InlineFrame { - return mutate(sandbox: values.map { $0.rawValue }.joined(separator: " ")) + return mutate(sandbox: .init(values.map { $0.rawValue }.joined(separator: " "), context: .trusted)) } public func source(_ value: String) -> InlineFrame { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func source(_ value: EnvironmentValue) -> InlineFrame { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func sourceDocument(_ value: String) -> InlineFrame { - return mutate(sourcedocument: value) + return mutate(sourcedocument: .init(value, context: .tainted(.html))) } public func name(_ value: String) -> InlineFrame { - return mutate(name: value) + return mutate(name: .init(value, context: .tainted(.html))) } public func width(_ size: Int) -> InlineFrame { - return mutate(width: size) + return mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> InlineFrame { - return mutate(height: size) + return mutate(height: .init(size, context: .trusted)) } public func referrerPolicy(_ value: Values.Policy) -> InlineFrame { - return mutate(referrerpolicy: value.rawValue) + return mutate(referrerpolicy: .init(value.rawValue, context: .trusted)) } public func loading(_ value: Values.Loading) -> InlineFrame { - return mutate(loading: value.rawValue) + return mutate(loading: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> InlineFrame { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> InlineFrame { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> InlineFrame { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> InlineFrame { - return mutate(key: key, value: value) + public func custom(key: String, value: Double) -> InlineFrame { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> InlineFrame { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> InlineFrame { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> InlineFrame { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> InlineFrame { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> InlineFrame { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> InlineFrame { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> InlineFrame { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> InlineFrame { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> InlineFrame { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> InlineFrame { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> InlineFrame { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> InlineFrame { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> InlineFrame { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> InlineFrame { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> InlineFrame { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> InlineFrame { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> InlineFrame { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> InlineFrame { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> InlineFrame { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> InlineFrame { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> InlineFrame { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> InlineFrame { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> InlineFrame { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> InlineFrame { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> InlineFrame { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> InlineFrame { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> InlineFrame { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -19181,12 +22197,12 @@ public struct Embed: EmptyNode, HtmlElement, BodyElement, FormElement, FigureEle internal var name: String { "embed" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Create an embed. public init() {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -19212,292 +22228,344 @@ public struct Embed: EmptyNode, HtmlElement, BodyElement, FormElement, FigureEle extension Embed: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, SourceAttribute, TypeAttribute, WidthAttribute, HeightAttribute { public func accessKey(_ value: Character) -> Embed { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Embed { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Embed { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Embed { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Embed { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Embed { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Embed { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Embed { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Embed { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Embed { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Embed { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Embed { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Embed { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Embed { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Embed { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Embed { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Embed { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Embed { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Embed { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Embed { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Embed { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Embed { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Embed { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Embed { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Embed { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Embed { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Embed { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Embed { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Embed { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Embed { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Embed { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Embed { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Embed { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Embed { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Embed { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func source(_ value: String) -> Embed { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func source(_ value: EnvironmentValue) -> Embed { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func type(_ value: Values.Media) -> Embed { - return mutate(type: value.rawValue) + return mutate(type: .init(value.rawValue, context: .trusted)) } public func width(_ size: Int) -> Embed { - return mutate(width: size) + return mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> Embed { - return mutate(height: size) + return mutate(height: .init(size, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Embed { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Embed { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Embed { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Embed { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Embed { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Embed { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Embed { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Embed { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Embed { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Embed { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Embed { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Embed { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Embed { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Embed { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Embed { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Embed { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Embed { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Embed { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Embed { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Embed { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Embed { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Embed { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Embed { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Embed { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Embed { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Embed { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Embed { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Embed { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Embed { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Embed { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Embed { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Embed { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -19515,7 +22583,7 @@ public struct Object: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var name: String { "object" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [ObjectElement] @@ -19530,7 +22598,7 @@ public struct Object: ContentNode, HtmlElement, BodyElement, FormElement, Figure self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [ObjectElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [ObjectElement]) { self.attributes = attributes self.context = context @@ -19559,296 +22627,348 @@ public struct Object: ContentNode, HtmlElement, BodyElement, FormElement, Figure extension Object: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, DataAttribute, TypeAttribute, NameAttribute, FormAttribute, WidthAttribute, HeightAttribute { public func accessKey(_ value: Character) -> Object { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Object { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Object { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Object { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Object { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Object { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Object { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Object { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Object { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Object { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Object { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Object { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Object { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Object { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Object { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Object { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Object { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Object { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Object { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Object { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Object { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Object { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Object { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Object { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Object { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Object { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Object { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Object { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Object { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Object { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Object { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Object { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Object { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Object { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Object { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func data(_ value: String) -> Object { - return mutate(data: value) + return mutate(data: .init(value, context: .tainted(.html))) } public func type(_ value: Values.Media) -> Object { - return mutate(type: value.rawValue) + return mutate(type: .init(value.rawValue, context: .trusted)) } public func name(_ value: String) -> Object { - return mutate(name: value) + return mutate(name: .init(value, context: .tainted(.html))) } public func form(_ value: String) -> Object { - return mutate(form: value) + return mutate(form: .init(value, context: .tainted(.html))) } public func width(_ size: Int) -> Object { - return mutate(width: size) + return mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> Object { - return mutate(height: size) + return mutate(height: .init(size, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Object { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Object { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Object { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Object { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Object { - return mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> Object { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Object { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Object { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Object { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Object { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Object { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Object { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Object { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Object { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Object { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Object { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Object { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Object { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Object { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Object { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Object { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Object { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Object { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Object { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Object { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Object { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Object { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Object { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Object { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Object { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Object { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Object { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -19867,7 +22987,7 @@ public struct Video: ContentNode, HtmlElement, BodyElement, FormElement, FigureE internal var name: String { "video" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [MediaElement] @@ -19882,7 +23002,7 @@ public struct Video: ContentNode, HtmlElement, BodyElement, FormElement, FigureE self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [MediaElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [MediaElement]) { self.attributes = attributes self.context = context @@ -19911,182 +23031,214 @@ public struct Video: ContentNode, HtmlElement, BodyElement, FormElement, FigureE extension Video: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, SourceAttribute, AutoplayAttribute, LoopAttribute, MutedAttribute, ControlsAttribute, WidthAttribute, HeightAttribute, PreloadAttribute, PlaysInlineAttribute, CrossOriginAttribute { public func accessKey(_ value: Character) -> Video { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Video { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Video { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Video { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Video { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Video { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Video { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Video { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Video { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Video { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Video { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Video { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Video { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Video { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Video { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Video { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Video { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Video { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Video { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Video { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Video { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Video { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Video { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Video { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Video { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Video { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Video { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Video { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Video { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Video { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Video { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Video { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Video { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Video { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Video { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func source(_ value: String) -> Video { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func source(_ value: EnvironmentValue) -> Video { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func autoplay(_ condition: Bool = true) -> Video { if condition { - return mutate(autoplay: "autoplay") + return mutate(autoplay: .init("autoplay", context: .trusted)) } return self @@ -20095,147 +23247,167 @@ extension Video: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, public func loop(_ condition: Bool = true) -> Video { if condition { - return mutate(loop: "loop") + return mutate(loop: .init("loop", context: .trusted)) } return self } public func muted() -> Video { - return mutate(muted: "muted") + return mutate(muted: .init("muted", context: .trusted)) } public func controls() -> Video { - return mutate(controls: "controls") + return mutate(controls: .init("controls", context: .trusted)) } public func width(_ size: Int) -> Video { - return mutate(width: size) + return mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> Video { - return mutate(height: size) + return mutate(height: .init(size, context: .trusted)) } public func preload(_ value: Values.Preload) -> Video { - return mutate(preload: value.rawValue) + return mutate(preload: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Video { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } public func playInline(_ condition: Bool = true) -> Video { if condition { - return mutate(playsinline: "playsinline") + return mutate(playsinline: .init("playsinline", context: .trusted)) } return self } public func crossOrigin(_ value: Credential.Mode) -> Video { - return mutate(crossorigin: value.rawValue) + return mutate(crossorigin: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Video { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Video { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Video { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Video { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Video { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Video { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Video { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Video { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Video { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Video { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Video { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Video { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Video { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Video { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Video { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Video { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Video { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Video { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Video { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Video { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Video { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Video { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Video { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Video { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Video { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Video { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Video { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Video { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Video { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Video { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Video { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -20254,7 +23426,7 @@ public struct Audio: ContentNode, HtmlElement, BodyElement, FormElement, FigureE internal var name: String { "audio" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [MediaElement] @@ -20269,7 +23441,7 @@ public struct Audio: ContentNode, HtmlElement, BodyElement, FormElement, FigureE self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [MediaElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [MediaElement]) { self.attributes = attributes self.context = context @@ -20298,186 +23470,218 @@ public struct Audio: ContentNode, HtmlElement, BodyElement, FormElement, FigureE extension Audio: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, SourceAttribute, AutoplayAttribute, LoopAttribute, MutedAttribute, ControlsAttribute, PreloadAttribute, CrossOriginAttribute { public func accessKey(_ value: Character) -> Audio { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Audio { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Audio { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Audio { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } public func crossOrigin(_ value: Credential.Mode) -> Audio { - return mutate(crossorigin: value.rawValue) + return mutate(crossorigin: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Audio { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Audio { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Audio { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Audio { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Audio { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Audio { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Audio { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Audio { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Audio { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Audio { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Audio { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Audio { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Audio { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Audio { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Audio { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Audio { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Audio { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Audio { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Audio { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Audio { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Audio { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Audio { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Audio { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Audio { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Audio { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Audio { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Audio { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Audio { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Audio { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Audio { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Audio { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func source(_ value: String) -> Audio { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func source(_ value: EnvironmentValue) -> Audio { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func autoplay(_ condition: Bool = true) -> Audio { if condition { - return mutate(autoplay: "autoplay") + return mutate(autoplay: .init("autoplay", context: .trusted)) } return self @@ -20486,126 +23690,146 @@ extension Audio: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, public func loop(_ condition: Bool = true) -> Audio { if condition { - return mutate(loop: "loop") + return mutate(loop: .init("loop", context: .trusted)) } return self } public func muted() -> Audio { - return mutate(muted: "muted") + return mutate(muted: .init("muted", context: .trusted)) } public func controls() -> Audio { - return mutate(controls: "controls") + return mutate(controls: .init("controls", context: .trusted)) } public func preload(_ value: Values.Preload) -> Audio { - return mutate(preload: value.rawValue) + return mutate(preload: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Audio { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Audio { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Audio { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Audio { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Audio { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Audio { - return mutate(key: key, value: value) + public func custom(key: String, value: Float) -> Audio { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Audio { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Audio { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Audio { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Audio { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Audio { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Audio { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Audio { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Audio { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Audio { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Audio { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Audio { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Audio { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Audio { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Audio { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Audio { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Audio { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Audio { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Audio { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Audio { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Audio { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Audio { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Audio { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Audio { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Audio { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Audio { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -20629,7 +23853,7 @@ public struct Map: ContentNode, HtmlElement, BodyElement, FormElement, FigureEle internal var name: String { "map" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [MapElement] @@ -20644,7 +23868,7 @@ public struct Map: ContentNode, HtmlElement, BodyElement, FormElement, FigureEle self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [MapElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [MapElement]) { self.attributes = attributes self.context = context @@ -20673,200 +23897,252 @@ public struct Map: ContentNode, HtmlElement, BodyElement, FormElement, FigureEle extension Map: GlobalAttributes, GlobalEventAttributes, NameAttribute { public func accessKey(_ value: Character) -> Map { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Map { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Map { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Map { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Map { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Map { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Map { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Map { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Map { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Map { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Map { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Map { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Map { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Map { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Map { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Map { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Map { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Map { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Map { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Map { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Map { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Map { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Map { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Map { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Map { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Map { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Map { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Map { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Map { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Map { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Map { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Map { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Map { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Map { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Map { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func name(_ value: String) -> Map { - return mutate(name: value) + return mutate(name: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> Map { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Map { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Map { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Map { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Map { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Map { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Map { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Map { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Map { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Map { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Map { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Map { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Map { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -20889,7 +24165,7 @@ public struct Form: ContentNode, HtmlElement, BodyElement, FigureElement, Object internal var name: String { "form" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [FormElement] @@ -20904,7 +24180,7 @@ public struct Form: ContentNode, HtmlElement, BodyElement, FigureElement, Object self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [FormElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [FormElement]) { self.attributes = attributes self.context = context @@ -20933,304 +24209,356 @@ public struct Form: ContentNode, HtmlElement, BodyElement, FigureElement, Object extension Form: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, ActionAttribute, AutocompleteAttribute, EncodingAttribute, MethodAttribute, NameAttribute, TargetAttribute, RelationshipAttribute { public func accessKey(_ value: Character) -> Form { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Form { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Form { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Form { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Form { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Form { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Form { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Form { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Form { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Form { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Form { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Form { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Form { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Form { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Form { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Form { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Form { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Form { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Form { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Form { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Form { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Form { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Form { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Form { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Form { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Form { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Form { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Form { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Form { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Form { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Form { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Form { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Form { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Form { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Form { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func action(_ value: String) -> Form { - return mutate(action: value) + return mutate(action: .init(value, context: .tainted(.html))) } public func autocomplete(_ value: Values.Completion) -> Form { - return mutate(autocomplete: value.rawValue) + return mutate(autocomplete: .init(value.rawValue, context: .trusted)) } public func autocomplete(_ values: OrderedSet) -> Form { - return mutate(autocomplete: values.map { $0.rawValue }.joined(separator: " ")) + return mutate(autocomplete: .init(values.map { $0.rawValue }.joined(separator: " "), context: .trusted)) } public func encoding(_ value: Values.Encoding) -> Form { - return mutate(enctype: value.rawValue) + return mutate(enctype: .init(value.rawValue, context: .trusted)) } public func method(_ value: Values.Method) -> Form { - return mutate(method: value.rawValue) + return mutate(method: .init(value.rawValue, context: .trusted)) } public func name(_ value: String) -> Form { - return mutate(name: value) + return mutate(name: .init(value, context: .tainted(.html))) } public func target(_ value: Values.Target) -> Form { - return mutate(target: value.rawValue) + return mutate(target: .init(value.rawValue, context: .trusted)) } public func relationship(_ value: Values.Relation) -> Form { - return mutate(rel: value.rawValue) + return mutate(rel: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Form { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Form { + return mutate(key: key, value: .init(value, context: context)) } - public func custom(key: String, value: Any) -> Form { - return mutate(key: key, value: value) + public func custom(key: String, value: Int) -> Form { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Form { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Form { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Form { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Form { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Form { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Form { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Form { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Form { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Form { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Form { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Form { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Form { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Form { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Form { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Form { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Form { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Form { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Form { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Form { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Form { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Form { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Form { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Form { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Form { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Form { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Form { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Form { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Form { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -21254,7 +24582,7 @@ public struct DataList: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var name: String { "datalist" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -21269,7 +24597,7 @@ public struct DataList: ContentNode, HtmlElement, BodyElement, FormElement, Figu self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -21298,272 +24626,324 @@ public struct DataList: ContentNode, HtmlElement, BodyElement, FormElement, Figu extension DataList: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> DataList { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> DataList { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> DataList { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> DataList { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> DataList { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> DataList { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> DataList { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> DataList { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> DataList { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> DataList { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> DataList { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> DataList { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> DataList { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> DataList { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> DataList { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> DataList { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> DataList { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> DataList { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> DataList { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> DataList { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> DataList { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> DataList { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> DataList { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> DataList { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> DataList { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> DataList { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> DataList { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> DataList { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> DataList { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> DataList { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> DataList { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> DataList { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> DataList { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> DataList { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> DataList { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> DataList { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> DataList { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> DataList { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> DataList { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> DataList { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> DataList { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> DataList { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> DataList { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> DataList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> DataList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> DataList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> DataList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> DataList { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> DataList { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> DataList { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> DataList { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> DataList { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> DataList { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> DataList { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> DataList { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> DataList { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> DataList { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> DataList { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> DataList { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> DataList { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> DataList { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> DataList { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> DataList { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> DataList { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> DataList { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> DataList { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> DataList { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -21582,7 +24962,7 @@ public struct Output: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var name: String { "output" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -21597,7 +24977,7 @@ public struct Output: ContentNode, HtmlElement, BodyElement, FormElement, Figure self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -21626,284 +25006,336 @@ public struct Output: ContentNode, HtmlElement, BodyElement, FormElement, Figure extension Output: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, ForAttribute, FormAttribute, NameAttribute { public func accessKey(_ value: Character) -> Output { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Output { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Output { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Output { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Output { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Output { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Output { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Output { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Output { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Output { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Output { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Output { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Output { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Output { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Output { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Output { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) - } - @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") - public func itemId(_ value: String) -> Output { - return mutate(itemid: value) - } + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy + } + + @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") + public func itemId(_ value: String) -> Output { + return mutate(itemid: .init(value, context: .tainted(.html))) + } public func itemProperty(_ value: String) -> Output { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Output { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Output { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Output { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Output { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Output { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Output { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Output { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Output { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Output { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Output { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Output { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Output { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Output { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Output { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Output { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Output { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Output { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func `for`(_ value: String) -> Output { - return mutate(for: value) + return mutate(for: .init(value, context: .tainted(.html))) } public func form(_ value: String) -> Output { - return mutate(form: value) + return mutate(form: .init(value, context: .tainted(.html))) } public func name(_ value: String) -> Output { - return mutate(name: value) + return mutate(name: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> Output { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Output { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Output { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Output { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Output { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Output { - return mutate(key: key, value: value) + public func custom(key: String, value: Float) -> Output { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Output { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Output { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Output { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Output { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Output { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Output { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Output { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Output { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Output { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Output { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Output { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Output { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Output { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Output { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Output { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Output { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Output { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Output { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Output { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Output { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Output { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Output { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Output { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Output { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Output { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -21922,7 +25354,7 @@ public struct Progress: ContentNode, HtmlElement, BodyElement, FormElement, Figu internal var name: String { "progress" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -21937,7 +25369,7 @@ public struct Progress: ContentNode, HtmlElement, BodyElement, FormElement, Figu self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -21966,289 +25398,341 @@ public struct Progress: ContentNode, HtmlElement, BodyElement, FormElement, Figu extension Progress: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, ValueAttribute, MaximumValueAttribute { public func accessKey(_ value: Character) -> Progress { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Progress { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Progress { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Progress { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Progress { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Progress { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Progress { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Progress { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Progress { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Progress { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Progress { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Progress { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Progress { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Progress { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Progress { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Progress { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Progress { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Progress { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Progress { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Progress { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Progress { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Progress { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Progress { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Progress { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Progress { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Progress { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Progress { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Progress { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Progress { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Progress { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Progress { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Progress { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Progress { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Progress { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Progress { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func maximum(_ value: Float) -> Progress { - return mutate(max: value) + return mutate(max: .init(value, context: .trusted)) } @_disfavoredOverload public func value(_ value: String) -> Progress { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func value(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Progress { - return mutate(value: LocalizedString(key: localizedKey, table: tableName)) + return mutate(value: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func value(verbatim value: String) -> Progress { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> Progress { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Progress { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Progress { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Progress { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Progress { - return mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> Progress { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Progress { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Progress { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Progress { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Progress { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Progress { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Progress { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Progress { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Progress { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Progress { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Progress { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Progress { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Progress { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Progress { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Progress { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Progress { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Progress { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Progress { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Progress { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Progress { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Progress { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Progress { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Progress { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Progress { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Progress { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Progress { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Progress { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -22269,7 +25753,7 @@ public struct Meter: ContentNode, HtmlElement, BodyElement, FormElement, FigureE internal var name: String { "meter" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -22284,7 +25768,7 @@ public struct Meter: ContentNode, HtmlElement, BodyElement, FormElement, FigureE self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -22313,305 +25797,357 @@ public struct Meter: ContentNode, HtmlElement, BodyElement, FormElement, FigureE extension Meter: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, ValueAttribute, MinimumValueAttribute, MaximumValueAttribute, LowAttribute, HighAttribute, OptimumAttribute { public func accessKey(_ value: Character) -> Meter { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Meter { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Meter { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Meter { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Meter { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Meter { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Meter { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Meter { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Meter { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Meter { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Meter { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Meter { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Meter { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Meter { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Meter { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Meter { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Meter { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Meter { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Meter { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Meter { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Meter { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Meter { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Meter { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Meter { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Meter { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Meter { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Meter { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Meter { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Meter { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Meter { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Meter { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Meter { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Meter { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Meter { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Meter { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func minimum(_ value: Float) -> Meter { - return mutate(min: value) + return mutate(min: .init(value, context: .trusted)) } public func maximum(_ value: Float) -> Meter { - return mutate(max: value) + return mutate(max: .init(value, context: .trusted)) } public func low(_ value: Float) -> Meter { - return mutate(low: value) + return mutate(low: .init(value, context: .trusted)) } public func high(_ value: Float) -> Meter { - return mutate(high: value) + return mutate(high: .init(value, context: .trusted)) } public func optimum(_ value: Float) -> Meter { - return mutate(optimum: value) + return mutate(optimum: .init(value, context: .trusted)) } @_disfavoredOverload public func value(_ value: String) -> Meter { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func value(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Meter { - return mutate(value: LocalizedString(key: localizedKey, table: tableName)) + return mutate(value: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func value(verbatim value: String) -> Meter { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> Meter { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Meter { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Meter { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Meter { - return mutate(key: key, value: value) + public func custom(key: String, value: Double) -> Meter { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Meter { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Meter { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Meter { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Meter { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Meter { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Meter { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Meter { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Meter { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Meter { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Meter { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Meter { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Meter { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Meter { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Meter { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Meter { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Meter { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Meter { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Meter { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Meter { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Meter { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Meter { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Meter { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Meter { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Meter { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Meter { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Meter { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Meter { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -22633,7 +26169,7 @@ public struct Details: ContentNode, HtmlElement, BodyElement, FormElement, Figur internal var name: String { "details" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -22648,7 +26184,7 @@ public struct Details: ContentNode, HtmlElement, BodyElement, FormElement, Figur self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -22677,165 +26213,197 @@ public struct Details: ContentNode, HtmlElement, BodyElement, FormElement, Figur extension Details: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, OpenAttribute, DetailEventAttribute { public func accessKey(_ value: Character) -> Details { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Details { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Details { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Details { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Details { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Details { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Details { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Details { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Details { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Details { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Details { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Details { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Details { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Details { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Details { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Details { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Details { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Details { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Details { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Details { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Details { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Details { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Details { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Details { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Details { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Details { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Details { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Details { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Details { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Details { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Details { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Details { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Details { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Details { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Details { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self @@ -22845,7 +26413,7 @@ extension Details: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes public func isOpen(_ condition: Bool = true) -> Details { if condition { - return mutate(open: "open") + return mutate(open: .init("open", context: .trusted)) } return self @@ -22854,118 +26422,138 @@ extension Details: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes public func open(_ condition: Bool = true) -> Details { if condition { - return mutate(open: "open") + return mutate(open: .init("open", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Details { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Details { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Details { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Details { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Details { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Details { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Details { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Details { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Details { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Details { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Details { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Details { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Details { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Detail, _ value: String) -> Details { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Details { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Details { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Details { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Details { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Details { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Details { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Details { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Details { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Details { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Details { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Details { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Details { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Details { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Details { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Details { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Details { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Details { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Details { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Details { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -22987,7 +26575,7 @@ public struct Dialog: ContentNode, BodyElement { internal var name: String { "dialog" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -23002,7 +26590,7 @@ public struct Dialog: ContentNode, BodyElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -23031,165 +26619,197 @@ public struct Dialog: ContentNode, BodyElement { extension Dialog: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, OpenAttribute { public func accessKey(_ value: Character) -> Dialog { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Dialog { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Dialog { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Dialog { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Dialog { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Dialog { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Dialog { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Dialog { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Dialog { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Dialog { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Dialog { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Dialog { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Dialog { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Dialog { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Dialog { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Dialog { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Dialog { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Dialog { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Dialog { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Dialog { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Dialog { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Dialog { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Dialog { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Dialog { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Dialog { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Dialog { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Dialog { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Dialog { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Dialog { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Dialog { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Dialog { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Dialog { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Dialog { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Dialog { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Dialog { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self @@ -23199,7 +26819,7 @@ extension Dialog: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, public func isOpen(_ condition: Bool) -> Dialog { if condition { - return mutate(open: "open") + return mutate(open: .init("open", context: .trusted)) } return self @@ -23208,114 +26828,134 @@ extension Dialog: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, public func open(_ condition: Bool = true) -> Dialog { if condition { - return mutate(open: "open") + return mutate(open: .init("open", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Dialog { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> Dialog { - return mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Dialog { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Dialog { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Dialog { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Dialog { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Dialog { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Dialog { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Dialog { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Dialog { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Dialog { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Dialog { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Dialog { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Dialog { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Dialog { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Dialog { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Dialog { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Dialog { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Dialog { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Dialog { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Dialog { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Dialog { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Dialog { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Dialog { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Dialog { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Dialog { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Dialog { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Dialog { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Dialog { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Dialog { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Dialog { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Dialog { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -23332,7 +26972,7 @@ public struct Script: ContentNode, HeadElement, BodyElement, FormElement, Figure internal var name: String { "script" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -23347,7 +26987,7 @@ public struct Script: ContentNode, HeadElement, BodyElement, FormElement, Figure self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -23376,240 +27016,292 @@ public struct Script: ContentNode, HeadElement, BodyElement, FormElement, Figure extension Script: GlobalAttributes, GlobalEventAttributes, AsynchronouslyAttribute, ReferrerPolicyAttribute, SourceAttribute, TypeAttribute, FetchPriorityAttribute, BlockingAttribute, IntegrityAttribute, DeferAttribute, CrossOriginAttribute { public func accessKey(_ value: Character) -> Script { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Script { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Script { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Script { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } public func crossOrigin(_ value: Credential.Mode) -> Script { - return mutate(crossorigin: value.rawValue) + return mutate(crossorigin: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Script { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Script { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func `defer`() -> Script { - return mutate(defer: "defer") + return mutate(defer: .init("defer", context: .trusted)) } public func direction(_ value: Values.Direction) -> Script { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Script { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Script { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Script { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Script { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Script { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Script { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func integrity(_ hashes: String...) -> Script { - return mutate(integrity: hashes.joined(separator: " ")) + return mutate(integrity: .init(hashes.joined(separator: " "), context: .tainted(.html))) } public func integrity(_ hashes: [String]) -> Script { - return mutate(integrity: hashes.joined(separator: " ")) + return mutate(integrity: .init(hashes.joined(separator: " "), context: .tainted(.html))) } public func `is`(_ value: String) -> Script { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Script { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Script { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Script { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Script { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Script { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Script { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Script { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Script { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Script { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Script { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Script { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Script { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Script { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Script { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Script { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Script { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Script { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Script { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Script { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Script { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Script { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func asynchronously() -> Script { - return mutate(async: "async") + return mutate(async: .init("async", context: .trusted)) } public func referrerPolicy(_ value: Values.Policy) -> Script { - return mutate(referrerpolicy: value.rawValue) + return mutate(referrerpolicy: .init(value.rawValue, context: .trusted)) } public func source(_ value: String) -> Script { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func source(_ value: EnvironmentValue) -> Script { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func type(_ value: Values.Script) -> Script { - return mutate(type: value.rawValue) + return mutate(type: .init(value.rawValue, context: .trusted)) } public func fetchPriority(_ value: Values.Priority) -> Script { - return mutate(fetchpriority: value.rawValue) + return mutate(fetchpriority: .init(value.rawValue, context: .trusted)) } public func blocking(_ value: Values.Blocking) -> Script { - return mutate(blocking: value.rawValue) + return mutate(blocking: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Script { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> Script { - return mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Script { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Script { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Script { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Script { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Script { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Script { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Script { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Script { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Script { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Script { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Script { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -23628,7 +27320,7 @@ public struct NoScript: ContentNode, HtmlElement, HeadElement, BodyElement, Form internal var name: String { "noscript" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -23643,7 +27335,7 @@ public struct NoScript: ContentNode, HtmlElement, HeadElement, BodyElement, Form self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -23672,196 +27364,248 @@ public struct NoScript: ContentNode, HtmlElement, HeadElement, BodyElement, Form extension NoScript: GlobalAttributes, GlobalEventAttributes { public func accessKey(_ value: Character) -> NoScript { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> NoScript { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> NoScript { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> NoScript { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> NoScript { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> NoScript { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> NoScript { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> NoScript { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> NoScript { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> NoScript { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> NoScript { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> NoScript { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> NoScript { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> NoScript { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> NoScript { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> NoScript { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> NoScript { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> NoScript { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> NoScript { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> NoScript { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> NoScript { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> NoScript { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> NoScript { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> NoScript { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> NoScript { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> NoScript { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> NoScript { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> NoScript { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> NoScript { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> NoScript { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> NoScript { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> NoScript { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> NoScript { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> NoScript { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> NoScript { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> NoScript { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> NoScript { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> NoScript { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> NoScript { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> NoScript { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> NoScript { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> NoScript { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> NoScript { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> NoScript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> NoScript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> NoScript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> NoScript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> NoScript { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -23885,7 +27629,7 @@ public struct Template: ContentNode, BodyElement, FormElement, FigureElement, Ob internal var name: String { "template" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -23900,7 +27644,7 @@ public struct Template: ContentNode, BodyElement, FormElement, FigureElement, Ob self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -23929,200 +27673,252 @@ public struct Template: ContentNode, BodyElement, FormElement, FigureElement, Ob extension Template: GlobalAttributes, GlobalEventAttributes, ShadowRootModeAttribute { public func accessKey(_ value: Character) -> Template { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Template { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Template { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Template { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Template { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Template { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Template { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Template { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Template { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Template { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Template { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Template { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Template { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Template { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Template { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Template { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Template { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Template { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Template { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Template { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Template { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Template { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Template { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Template { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Template { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Template { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Template { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Template { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Template { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Template { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Template { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Template { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Template { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Template { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Template { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Template { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Template { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Template { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Template { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Template { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Template { - return mutate(key: key, value: value) + public func custom(key: String, value: Float) -> Template { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Template { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Template { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Template { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Template { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Template { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Template { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func shadowRootMode(_ value: Values.Shadow.Mode) -> Template { - return mutate(shadowrootmode: value.rawValue) + return mutate(shadowrootmode: .init(value.rawValue, context: .trusted)) } } @@ -24138,7 +27934,7 @@ public struct Canvas: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var name: String { "canvas" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -24150,7 +27946,7 @@ public struct Canvas: ContentNode, HtmlElement, BodyElement, FormElement, Figure self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -24179,280 +27975,332 @@ public struct Canvas: ContentNode, HtmlElement, BodyElement, FormElement, Figure extension Canvas: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, WidthAttribute, HeightAttribute { public func accessKey(_ value: Character) -> Canvas { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Canvas { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Canvas { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Canvas { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Canvas { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Canvas { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Canvas { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Canvas { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Canvas { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Canvas { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Canvas { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Canvas { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Canvas { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Canvas { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Canvas { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Canvas { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Canvas { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Canvas { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Canvas { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Canvas { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Canvas { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Canvas { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Canvas { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Canvas { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Canvas { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Canvas { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Canvas { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Canvas { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Canvas { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Canvas { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Canvas { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Canvas { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Canvas { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Canvas { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Canvas { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func width(_ size: Int) -> Canvas { - return mutate(width: size) + return mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> Canvas { - return mutate(height: size) + return mutate(height: .init(size, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Canvas { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Canvas { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Canvas { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Canvas { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Canvas { - return mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> Canvas { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Canvas { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Canvas { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Canvas { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Canvas { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Canvas { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Canvas { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Canvas { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Canvas { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Canvas { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Canvas { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Canvas { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Canvas { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Canvas { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Canvas { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Canvas { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Canvas { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Canvas { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Canvas { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Canvas { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Canvas { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Canvas { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Canvas { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Canvas { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Canvas { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Canvas { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Canvas { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -24476,7 +28324,7 @@ public struct Table: ContentNode, HtmlElement, BodyElement, FormElement, FigureE internal var name: String { "table" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [TableElement] @@ -24491,7 +28339,7 @@ public struct Table: ContentNode, HtmlElement, BodyElement, FormElement, FigureE self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [TableElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [TableElement]) { self.attributes = attributes self.context = context @@ -24520,280 +28368,332 @@ public struct Table: ContentNode, HtmlElement, BodyElement, FormElement, FigureE extension Table: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, WidthAttribute, HeightAttribute { public func accessKey(_ value: Character) -> Table { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Table { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Table { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Table { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Table { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Table { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Table { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Table { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Table { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Table { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Table { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Table { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Table { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Table { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Table { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Table { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Table { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Table { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Table { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Table { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Table { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Table { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Table { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Table { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Table { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Table { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Table { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Table { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Table { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Table { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Table { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Table { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Table { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Table { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Table { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func width(_ size: Int) -> Table { - return mutate(width: size) + return mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> Table { - return mutate(height: size) + return mutate(height: .init(size, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Table { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Table { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Table { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Table { - return mutate(key: key, value: value) + public func custom(key: String, value: Double) -> Table { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Table { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Table { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Table { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Table { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Table { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Table { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Table { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Table { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Table { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Table { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Table { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Table { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Table { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Table { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Table { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Table { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Table { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Table { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Table { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Table { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Table { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Table { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Table { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Table { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Table { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Table { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Table { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -24816,7 +28716,7 @@ public struct Vector: ContentNode, HtmlElement, BodyElement, FormElement, Figure internal var name: String { "svg" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [VectorElement] @@ -24831,7 +28731,7 @@ public struct Vector: ContentNode, HtmlElement, BodyElement, FormElement, Figure self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [VectorElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [VectorElement]) { self.attributes = attributes self.context = context @@ -24860,86 +28760,136 @@ public struct Vector: ContentNode, HtmlElement, BodyElement, FormElement, Figure extension Vector: GlobalVectorAttributes, WidthAttribute, HeightAttribute, ViewBoxAttribute, NamespaceAttribute { public func id(_ value: String) -> Vector { - return self.mutate(id: value) + return self.mutate(id: .init(value, context: .tainted(.html))) } public func tabIndex(_ value: Int) -> Vector { - return self.mutate(tabindex: value) + return self.mutate(tabindex: .init(value, context: .trusted)) } public func width(_ size: Int) -> Vector { - return self.mutate(width: size) + return mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> Vector { - return self.mutate(height: size) + return mutate(height: .init(size, context: .trusted)) } public func `class`(_ value: String) -> Vector { - return self.mutate(class: value) + return self.mutate(class: .init(value, context: .tainted(.html))) } public func style(_ value: String) -> Vector { - return self.mutate(style: TaintedString(value, as: .css(.attribute))) + return self.mutate(style: .init(value, context: .tainted(.css))) } @available(*, deprecated, message: "Use the viewBox(x:y:width:height:) modifier instead.") public func viewBox(_ value: String) -> Vector { - return self.mutate(viewbox: value) + return self.mutate(viewbox: .init(value, context: .tainted(.html))) } public func viewBox(x: Int, y: Int, width: Int, height: Int) -> Vector { - return self.mutate(viewbox: "\(x) \(y) \(width) \(height)") + return self.mutate(viewbox: .init("\(x) \(y) \(width) \(height)", context: .trusted)) } public func viewBox(x: Double, y: Double, width: Double, height: Double) -> Vector { - return self.mutate(viewbox: "\(x) \(y) \(width) \(height)") + return self.mutate(viewbox: .init("\(x) \(y) \(width) \(height)", context: .trusted)) } public func fill(_ color: String, opacity: Double? = nil) -> Vector { - return self.mutate(fill: color).mutate(fillopacity: opacity) + + var copy = self + + copy = copy.mutate(fill: .init(color, context: .tainted(.html))) + + if let opacity = opacity { + copy = copy.mutate(fillopacity: .init(opacity, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func stroke(_ value: String) -> Vector { - return self.mutate(stroke: value) + return self.mutate(stroke: .init(value, context: .tainted(.html))) } public func stroke(_ color: String, width: Int? = nil, opacity: Double? = nil, cap: Values.Linecap? = nil, join: Values.Linejoin? = nil) -> Vector { - return self.mutate(stroke: color).mutate(strokewidth: width).mutate(strokeopacity: opacity).mutate(strokelinecap: cap?.rawValue).mutate(strokelinejoin: join?.rawValue) + + var copy = self + + copy = copy.mutate(stroke: .init(color, context: .tainted(.html))) + + if let width = width { + copy = copy.mutate(strokewidth: .init(width, context: .trusted)) + } + + if let opacity = opacity { + copy = copy.mutate(strokeopacity: .init(opacity, context: .trusted)) + } + + if let cap = cap { + copy = copy.mutate(strokelinecap: .init(cap.rawValue, context: .trusted)) + } + + if let join = join { + copy = copy.mutate(strokelinejoin: .init(join.rawValue, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeWidth(_ size: Int) -> Vector { - return self.mutate(strokewidth: size) + return self.mutate(strokewidth: .init(size, context: .trusted)) } @available(*, deprecated, message: "Use the fill(_:opacity:) modifier instead.") public func fillOpacity(_ value: Double) -> Vector { - return self.mutate(fillopacity: value) + return self.mutate(fillopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeOpacity(_ value: Double) -> Vector { - return self.mutate(strokeopacity: value) + return self.mutate(strokeopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineCap(_ value: Values.Linecap) -> Vector { - return self.mutate(strokelinecap: value.rawValue) + return self.mutate(strokelinecap: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineJoin(_ value: Values.Linejoin) -> Vector { - return self.mutate(strokelinejoin: value.rawValue) + return self.mutate(strokelinejoin: .init(value.rawValue, context: .trusted)) } public func namespace(_ value: String) -> Vector { - return self.mutate(namespace: value) + return self.mutate(namespace: .init(value, context: .tainted(.html))) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Vector { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Vector { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Vector { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Vector { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Vector { - return self.mutate(key: key, value: value) + public func custom(key: String, value: Float) -> Vector { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Vector { + return mutate(key: key, value: .init(value, context: context)) } } @@ -24966,7 +28916,7 @@ public struct Slot: ContentNode, BodyElement, FormElement, FigureElement, Object internal var name: String { "slot" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -24981,7 +28931,7 @@ public struct Slot: ContentNode, BodyElement, FormElement, FigureElement, Object self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -25010,179 +28960,231 @@ public struct Slot: ContentNode, BodyElement, FormElement, FigureElement, Object extension Slot: GlobalAttributes, NameAttribute { public func accessKey(_ value: Character) -> Slot { - return self.mutate(accesskey: value) + return self.mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Slot { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Slot { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Slot { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Slot { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Slot { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Slot { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Slot { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Slot { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Slot { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Slot { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Slot { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Slot { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Slot { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Slot { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Slot { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Slot { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Slot { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Slot { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Slot { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Slot { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Slot { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Slot { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Slot { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Slot { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Slot { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Slot { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Slot { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Slot { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Slot { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Slot { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Slot { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Slot { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Slot { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Slot { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func name(_ value: String) -> Slot { - return mutate(name: value) + return mutate(name: .init(value, context: .tainted(.html))) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Slot { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Slot { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Slot { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Slot { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Slot { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Slot { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Slot { + return mutate(key: key, value: .init(value, context: context)) } public func popover(_ value: Values.Popover.State) -> Slot { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/DefinitionElements.swift b/Sources/HTMLKit/Abstraction/Elements/DefinitionElements.swift index a03aee84..e591b6ca 100644 --- a/Sources/HTMLKit/Abstraction/Elements/DefinitionElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/DefinitionElements.swift @@ -27,7 +27,7 @@ public struct TermName: ContentNode, DescriptionElement { internal var name: String { "dt" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -42,7 +42,7 @@ public struct TermName: ContentNode, DescriptionElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -71,272 +71,324 @@ public struct TermName: ContentNode, DescriptionElement { extension TermName: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> TermName { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> TermName { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> TermName { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> TermName { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> TermName { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> TermName { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> TermName { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> TermName { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> TermName { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> TermName { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> TermName { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> TermName{ if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> TermName { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> TermName { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> TermName { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> TermName { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> TermName { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> TermName { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> TermName { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> TermName { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> TermName { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> TermName { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> TermName { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> TermName { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> TermName { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> TermName { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> TermName { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> TermName { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> TermName { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> TermName { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> TermName { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> TermName { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> TermName { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> TermName { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> TermName { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> TermName { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> TermName { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> TermName { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> TermName { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> TermName { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> TermName { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> TermName { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> TermName { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> TermName { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> TermName { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> TermName { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> TermName { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> TermName { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> TermName { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> TermName { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> TermName { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> TermName { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> TermName { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> TermName { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> TermName { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> TermName { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> TermName { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> TermName { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> TermName { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> TermName { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> TermName { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> TermName { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> TermName { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> TermName { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> TermName { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> TermName { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> TermName { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -358,7 +410,7 @@ public struct TermDefinition: ContentNode, DescriptionElement { internal var name: String { "dd" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -373,7 +425,7 @@ public struct TermDefinition: ContentNode, DescriptionElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -402,271 +454,323 @@ public struct TermDefinition: ContentNode, DescriptionElement { extension TermDefinition: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> TermDefinition { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> TermDefinition { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> TermDefinition { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> TermDefinition { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> TermDefinition { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> TermDefinition { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> TermDefinition { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> TermDefinition { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> TermDefinition { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> TermDefinition { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> TermDefinition { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> TermDefinition { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> TermDefinition { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> TermDefinition { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> TermDefinition { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> TermDefinition { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> TermDefinition { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> TermDefinition { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> TermDefinition { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> TermDefinition { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> TermDefinition { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> TermDefinition { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> TermDefinition { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> TermDefinition { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> TermDefinition { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> TermDefinition { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> TermDefinition { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> TermDefinition { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> TermDefinition { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> TermDefinition { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> TermDefinition { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> TermDefinition { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> TermDefinition { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> TermDefinition { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> TermDefinition { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> TermDefinition { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> TermDefinition { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> TermDefinition { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> TermDefinition { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> TermDefinition { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> TermDefinition { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> TermDefinition { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> TermDefinition { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> TermDefinition { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> TermDefinition { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> TermDefinition { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> TermDefinition { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> TermDefinition { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> TermDefinition { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> TermDefinition { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> TermDefinition { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> TermDefinition { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> TermDefinition { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> TermDefinition { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> TermDefinition { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> TermDefinition { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> TermDefinition { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> TermDefinition { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> TermDefinition { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> TermDefinition { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> TermDefinition { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> TermDefinition { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> TermDefinition { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> TermDefinition { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> TermDefinition { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> TermDefinition { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> TermDefinition { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/FigureElements.swift b/Sources/HTMLKit/Abstraction/Elements/FigureElements.swift index 3d54b2df..c01d0330 100644 --- a/Sources/HTMLKit/Abstraction/Elements/FigureElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/FigureElements.swift @@ -23,7 +23,7 @@ public struct FigureCaption: ContentNode, FigureElement { internal var name: String { "figcaption" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -38,7 +38,7 @@ public struct FigureCaption: ContentNode, FigureElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -67,271 +67,323 @@ public struct FigureCaption: ContentNode, FigureElement { extension FigureCaption: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> FigureCaption { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> FigureCaption { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> FigureCaption { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> FigureCaption { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> FigureCaption { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> FigureCaption { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> FigureCaption { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> FigureCaption { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> FigureCaption { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> FigureCaption { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> FigureCaption { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> FigureCaption { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> FigureCaption { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> FigureCaption { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> FigureCaption { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> FigureCaption { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> FigureCaption { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> FigureCaption { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> FigureCaption { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> FigureCaption { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> FigureCaption { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> FigureCaption { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> FigureCaption { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> FigureCaption { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> FigureCaption { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> FigureCaption { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> FigureCaption { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> FigureCaption { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> FigureCaption { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> FigureCaption { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> FigureCaption { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> FigureCaption { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> FigureCaption { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> FigureCaption { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> FigureCaption { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> FigureCaption { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> FigureCaption { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> FigureCaption { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> FigureCaption { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> FigureCaption { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> FigureCaption { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> FigureCaption { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> FigureCaption { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> FigureCaption { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> FigureCaption { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> FigureCaption { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> FigureCaption { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> FigureCaption { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> FigureCaption { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> FigureCaption { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> FigureCaption { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> FigureCaption { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> FigureCaption { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> FigureCaption { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> FigureCaption { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> FigureCaption { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> FigureCaption { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> FigureCaption { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> FigureCaption { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> FigureCaption { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> FigureCaption { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> FigureCaption { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> FigureCaption { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> FigureCaption { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> FigureCaption { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> FigureCaption { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> FigureCaption { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/FormElements.swift b/Sources/HTMLKit/Abstraction/Elements/FormElements.swift index 67fd3b50..a89e78b0 100644 --- a/Sources/HTMLKit/Abstraction/Elements/FormElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/FormElements.swift @@ -18,12 +18,12 @@ public struct Input: EmptyNode, FormElement { internal var name: String { "input" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Create an input. public init() {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -49,211 +49,243 @@ public struct Input: EmptyNode, FormElement { extension Input: GlobalAttributes, GlobalEventAttributes, AcceptAttribute, AlternateAttribute, AutocompleteAttribute, CheckedAttribute, DisabledAttribute, FormAttribute, FormActionAttribute, HeightAttribute, ListAttribute, MaximumValueAttribute, MaximumLengthAttribute, MinimumValueAttribute, MinimumLengthAttribute, MultipleAttribute, NameAttribute, PatternAttribute, PlaceholderAttribute, ReadOnlyAttribute, RequiredAttribute, SizeAttribute, SourceAttribute, StepAttribute, TypeAttribute, ValueAttribute, WidthAttribute, PopoverTargetAttribute, PopoverActionAttribute { public func accessKey(_ value: Character) -> Input { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Input { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Input { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Input { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Input { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Input { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Input { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Input { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Input { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Input { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Input { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Input { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Input { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Input { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Input { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Input { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Input { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Input { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Input { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Input { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Input { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Input { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Input { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Input { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Input { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Input { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Input { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Input { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Input { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Input { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Input { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Input { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Input { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Input { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Input { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func accept(_ specifiers: [String]) -> Input { - return mutate(accept: specifiers.joined(separator: ", ")) + return mutate(accept: .init(specifiers.joined(separator: ", "), context: .tainted(.html))) } public func accept(_ specifiers: String...) -> Input { - return mutate(accept: specifiers.joined(separator: ", ")) + return mutate(accept: .init(specifiers.joined(separator: ", "), context: .tainted(.html))) } public func accept(_ specifiers: [Values.Media]) -> Input { - return mutate(accept: specifiers.map { $0.rawValue }.joined(separator: ", ")) + return mutate(accept: .init(specifiers.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func accept(_ specifiers: Values.Media...) -> Input { - return mutate(accept: specifiers.map { $0.rawValue }.joined(separator: ", ")) + return mutate(accept: .init(specifiers.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } @_disfavoredOverload public func alternate(_ value: String) -> Input { - return mutate(alternate: value) + return mutate(alternate: .init(value, context: .tainted(.html))) } public func alternate(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Input { - return mutate(alternate: LocalizedString(key: localizedKey, table: tableName)) + return mutate(alternate: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func alternate(verbatim value: String) -> Input { - return mutate(alternate: value) + return mutate(alternate: .init(value, context: .tainted(.html))) } public func autocomplete(_ value: Values.Completion) -> Input { - return mutate(autocomplete: value.rawValue) + return mutate(autocomplete: .init(value.rawValue, context: .trusted)) } public func autocomplete(_ values: OrderedSet) -> Input { - return mutate(autocomplete: values.map { $0.rawValue }.joined(separator: " ")) + return mutate(autocomplete: .init(values.map { $0.rawValue }.joined(separator: " "), context: .trusted)) } public func checked(_ condition: Bool = true) -> Input { if condition { - return mutate(checked: "checked") + return mutate(checked: .init("checked", context: .trusted)) } return self @@ -262,77 +294,77 @@ extension Input: GlobalAttributes, GlobalEventAttributes, AcceptAttribute, Alter public func disabled(_ condition: Bool = true) -> Input { if condition { - return mutate(disabled: "disabled") + return mutate(disabled: .init("disabled", context: .trusted)) } return self } public func form(_ value: String) -> Input { - return mutate(form: value) + return mutate(form: .init(value, context: .tainted(.html))) } public func formAction(_ value: String) -> Input { - return mutate(formaction: value) + return mutate(formaction: .init(value, context: .tainted(.html))) } public func height(_ size: Int) -> Input { - return mutate(height: size) + return mutate(height: .init(size, context: .trusted)) } public func list(_ value: String) -> Input { - return mutate(list: value) + return mutate(list: .init(value, context: .tainted(.html))) } public func maximum(_ value: String) -> Input { - return mutate(max: value) + return mutate(max: .init(value, context: .tainted(.html))) } public func maximum(length value: Int) -> Input { - return mutate(maxlength: value) + return mutate(maxlength: .init(value, context: .trusted)) } public func minimum(_ value: String) -> Input { - return mutate(min: value) + return mutate(min: .init(value, context: .tainted(.html))) } public func minimum(length value: Int) -> Input { - return mutate(minlength: value) + return mutate(minlength: .init(value, context: .trusted)) } public func multiple() -> Input { - return mutate(multiple: "multiple") + return mutate(multiple: .init("multiple", context: .trusted)) } public func name(_ value: String) -> Input { - return mutate(name: value) + return mutate(name: .init(value, context: .tainted(.html))) } public func pattern(_ regex: String) -> Input { - return mutate(pattern: regex) + return mutate(pattern: .init(regex, context: .tainted(.html))) } @_disfavoredOverload public func placeholder(_ value: String) -> Input { - return mutate(placeholder: value) + return mutate(placeholder: .init(value, context: .tainted(.html))) } public func placeholder(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Input { - return mutate(placeholder: LocalizedString(key: localizedKey, table: tableName)) + return mutate(placeholder: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func placeholder(verbatim value: String) -> Input { - return mutate(placeholder: value) + return mutate(placeholder: .init(value, context: .tainted(.html))) } public func readonly() -> Input { - return mutate(readonly: "readonly") + return mutate(readonly: .init("readonly", context: .trusted)) } public func readonly(_ condition: Bool) -> Input { if condition { - return mutate(readonly: "readonly") + return mutate(readonly: .init("readonly", context: .trusted)) } return self @@ -341,84 +373,113 @@ extension Input: GlobalAttributes, GlobalEventAttributes, AcceptAttribute, Alter public func required(_ condition: Bool = true) -> Input { if condition { - return mutate(required: "required") + return mutate(required: .init("required", context: .trusted)) } return self } public func size(_ size: Int) -> Input { - return mutate(size: size) + return mutate(size: .init(size, context: .trusted)) } public func source(_ value: String) -> Input { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func source(_ value: EnvironmentValue) -> Input { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func step(_ size: Int) -> Input { - return mutate(step: size) + return mutate(step: .init(size, context: .trusted)) } public func type(_ value: Values.Input) -> Input { - return mutate(type: value.rawValue) + return mutate(type: .init(value.rawValue, context: .trusted)) } @_disfavoredOverload public func value(_ value: String) -> Input { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func value(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Input { - return mutate(value: LocalizedString(key: localizedKey, table: tableName)) + return mutate(value: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func value(verbatim value: String) -> Input { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func width(_ size: Int) -> Input { - return mutate(width: size) + return mutate(width: .init(size, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Input { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } public func popoverTarget(_ value: String, action: Values.Popover.Action? = nil) -> Input { - return mutate(popovertarget: value).mutate(popovertargetaction: action?.rawValue) + + var copy = self + + copy = copy.mutate(popovertarget: .init(value, context: .tainted(.html))) + + if let action = action { + copy = copy.mutate(popoveraction: .init(action.rawValue, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the popoverTarget(_:action:) modifier instead.") public func popoverAction(_ value: Values.Popover.Action) -> Input { - return mutate(popoveraction: value.rawValue) + return mutate(popoveraction: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> Input { - return mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Input { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Input { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Input { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Input { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Input { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Input { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Input { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Input { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Input { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Input { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Input { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -439,7 +500,7 @@ public struct Label: ContentNode, FormElement { internal var name: String { "label" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -454,7 +515,7 @@ public struct Label: ContentNode, FormElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -483,276 +544,328 @@ public struct Label: ContentNode, FormElement { extension Label: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, ForAttribute { public func accessKey(_ value: Character) -> Label { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Label { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Label { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Label { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Label { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Label { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Label { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Label { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Label { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Label { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Label { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Label { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Label { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Label { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Label { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Label { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Label { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Label { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Label { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Label { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Label { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Label { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Label { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Label { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Label { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Label { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Label { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Label { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Label { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Label { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Label { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Label { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Label { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Label { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Label { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func `for`(_ value: String) -> Label { - return mutate(for: value) + return mutate(for: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> Label { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Label { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Label { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Label { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Label { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Label { - return mutate(key: key, value: value) + public func custom(key: String, value: Float) -> Label { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Label { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Label { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Label { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Label { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Label { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Label { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Label { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Label { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Label { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Label { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Label { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Label { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Label { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Label { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Label { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Label { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Label { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Label { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Label { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Label { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Label { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Label { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Label { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Label { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Label { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -787,7 +900,7 @@ public struct Select: ContentNode, FormElement { internal var name: String { "select" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -802,7 +915,7 @@ public struct Select: ContentNode, FormElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -831,238 +944,290 @@ public struct Select: ContentNode, FormElement { extension Select: GlobalAttributes, GlobalEventAttributes, AutocompleteAttribute, DisabledAttribute, FormAttribute, MultipleAttribute, NameAttribute, RequiredAttribute, SizeAttribute { public func accessKey(_ value: Character) -> Select { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Select { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Select { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Select { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Select { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Select { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Select { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Select { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Select { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Select { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Select { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Select { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Select { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Select { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Select { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Select { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Select { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Select { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Select { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Select { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Select { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Select { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Select { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Select { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Select { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Select { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Select { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Select { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Select { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Select { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Select { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Select { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Select { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Select { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Select { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func autocomplete(_ value: Values.Completion) -> Select { - return mutate(autocomplete: value.rawValue) + return mutate(autocomplete: .init(value.rawValue, context: .trusted)) } public func autocomplete(_ values: OrderedSet) -> Select { - return mutate(autocomplete: values.map { $0.rawValue }.joined(separator: " ")) + return mutate(autocomplete: .init(values.map { $0.rawValue }.joined(separator: " "), context: .trusted)) } public func disabled(_ condition: Bool = true) -> Select { if condition { - return mutate(disabled: "disabled") + return mutate(disabled: .init("disabled", context: .trusted)) } return self } public func form(_ value: String) -> Select { - return mutate(form: value) + return mutate(form: .init(value, context: .tainted(.html))) } public func multiple() -> Select { - return mutate(multiple: "multiple") + return mutate(multiple: .init("multiple", context: .trusted)) } public func name(_ value: String) -> Select { - return mutate(name: value) + return mutate(name: .init(value, context: .tainted(.html))) } public func required(_ condition: Bool = true) -> Select { if condition { - return mutate(required: "required") + return mutate(required: .init("required", context: .trusted)) } return self } public func size(_ size: Int) -> Select { - return mutate(size: size) + return mutate(size: .init(size, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Select { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Select { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Select { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Select { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Select { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Select { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Select { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Select { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Select { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Select { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Select { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Select { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Select { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -1081,7 +1246,7 @@ public struct TextArea: ContentNode, FormElement { internal var name: String { "textarea" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [String] @@ -1096,7 +1261,7 @@ public struct TextArea: ContentNode, FormElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [String]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [String]) { self.attributes = attributes self.context = context @@ -1125,228 +1290,260 @@ public struct TextArea: ContentNode, FormElement { extension TextArea: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, AutocompleteAttribute, ColumnsAttribute, DisabledAttribute, FormAttribute, MaximumLengthAttribute, MinimumLengthAttribute, NameAttribute, PlaceholderAttribute, ReadOnlyAttribute, RequiredAttribute, RowsAttribute, WrapAttribute { public func accessKey(_ value: Character) -> TextArea { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> TextArea { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> TextArea { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> TextArea { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> TextArea { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> TextArea { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> TextArea { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> TextArea { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> TextArea { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> TextArea { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> TextArea { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> TextArea { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> TextArea { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> TextArea { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> TextArea { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> TextArea { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> TextArea { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> TextArea { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> TextArea { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> TextArea { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> TextArea { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> TextArea { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> TextArea { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> TextArea { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> TextArea { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> TextArea { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> TextArea { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> TextArea { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> TextArea { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> TextArea { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> TextArea { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> TextArea { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> TextArea { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> TextArea { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> TextArea { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func autocomplete(_ value: Values.Completion) -> TextArea { - return mutate(autocomplete: value.rawValue) + return mutate(autocomplete: .init(value.rawValue, context: .trusted)) } public func autocomplete(_ values: OrderedSet) -> TextArea { - return mutate(autocomplete: values.map { $0.rawValue }.joined(separator: " ")) + return mutate(autocomplete: .init(values.map { $0.rawValue }.joined(separator: " "), context: .trusted)) } public func columns(_ size: Int) -> TextArea { - return mutate(cols: size) + return mutate(cols: .init(size, context: .trusted)) } public func disabled(_ condition: Bool = true) -> TextArea { if condition { - return mutate(disabled: "disabled") + return mutate(disabled: .init("disabled", context: .trusted)) } return self } public func form(_ value: String) -> TextArea { - return mutate(form: value) + return mutate(form: .init(value, context: .tainted(.html))) } public func maximum(length value: Int) -> TextArea { - return mutate(maxlength: value) + return mutate(maxlength: .init(value, context: .trusted)) } public func minimum(length value: Int) -> TextArea { - return mutate(minlength: value) + return mutate(minlength: .init(value, context: .trusted)) } public func name(_ value: String) -> TextArea { - return mutate(name: value) + return mutate(name: .init(value, context: .tainted(.html))) } @_disfavoredOverload public func placeholder(_ value: String) -> TextArea { - return mutate(placeholder: value) + return mutate(placeholder: .init(value, context: .tainted(.html))) } public func placeholder(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> TextArea { - return mutate(placeholder: LocalizedString(key: localizedKey, table: tableName)) + return mutate(placeholder: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func placeholder(verbatim value: String) -> TextArea { - return mutate(placeholder: value) + return mutate(placeholder: .init(value, context: .tainted(.html))) } public func readonly() -> TextArea { - return mutate(readonly: "readonly") + return mutate(readonly: .init("readonly", context: .trusted)) } public func readonly(_ condition: Bool) -> TextArea { if condition { - return mutate(readonly: "readonly") + return mutate(readonly: .init("readonly", context: .trusted)) } return self @@ -1355,122 +1552,142 @@ extension TextArea: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttribute public func required(_ condition: Bool = true) -> TextArea { if condition { - return mutate(required: "required") + return mutate(required: .init("required", context: .trusted)) } return self } public func rows(_ size: Int) -> TextArea { - return mutate(rows: size) + return mutate(rows: .init(size, context: .trusted)) } public func wrap(_ value: Values.Wrapping) -> TextArea { - return mutate(wrap: value.rawValue) + return mutate(wrap: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> TextArea { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> TextArea { - return mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> TextArea { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> TextArea { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> TextArea { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> TextArea { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> TextArea { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> TextArea { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> TextArea { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> TextArea { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> TextArea { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> TextArea { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> TextArea { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> TextArea { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> TextArea { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> TextArea { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> TextArea { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> TextArea { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> TextArea { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> TextArea { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> TextArea { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> TextArea { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> TextArea { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> TextArea { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> TextArea { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> TextArea { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> TextArea { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> TextArea { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> TextArea { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> TextArea { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> TextArea { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> TextArea { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -1488,7 +1705,7 @@ public struct Button: ContentNode, FormElement { internal var name: String { "button" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -1503,7 +1720,7 @@ public struct Button: ContentNode, FormElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -1532,165 +1749,197 @@ public struct Button: ContentNode, FormElement { extension Button: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, DisabledAttribute, FormAttribute, FormActionAttribute, NameAttribute, TypeAttribute, ValueAttribute, PopoverTargetAttribute, PopoverActionAttribute { public func accessKey(_ value: Character) -> Button { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Button { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Button { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Button { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Button { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Button { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Button { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Button { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Button { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Button { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Button { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Button { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Button { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Button { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Button { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Button { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Button { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Button { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Button { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Button { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Button { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Button { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Button { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Button { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Button { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Button { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Button { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Button { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Button { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Button { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Button { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Button { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Button { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Button { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Button { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self @@ -1699,152 +1948,181 @@ extension Button: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, public func disabled(_ condition: Bool = true) -> Button { if condition { - return mutate(disabled: "disabled") + return mutate(disabled: .init("disabled", context: .trusted)) } return self } public func form(_ value: String) -> Button { - return mutate(form: value) + return mutate(form: .init(value, context: .tainted(.html))) } public func formAction(_ value: String) -> Button { - return mutate(formaction: value) + return mutate(formaction: .init(value, context: .tainted(.html))) } public func name(_ value: String) -> Button { - return mutate(name: value) + return mutate(name: .init(value, context: .tainted(.html))) } public func type(_ value: Values.Button) -> Button { - return mutate(type: value.rawValue) + return mutate(type: .init(value.rawValue, context: .trusted)) } @_disfavoredOverload public func value(_ value: String) -> Button { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func value(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Button { - return mutate(value: LocalizedString(key: localizedKey, table: tableName)) + return mutate(value: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func value(verbatim value: String) -> Button { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> Button { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } public func popoverTarget(_ value: String, action: Values.Popover.Action? = nil) -> Button { - return mutate(popovertarget: value).mutate(popovertargetaction: action?.rawValue) + + var copy = self + + copy = copy.mutate(popovertarget: .init(value, context: .tainted(.html))) + + if let action = action { + copy = copy.mutate(popoveraction: .init(action.rawValue, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the popoverTarget(_:action:) modifier instead.") public func popoverAction(_ value: Values.Popover.Action) -> Button { - return mutate(popoveraction: value.rawValue) + return mutate(popoveraction: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Button { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Button { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Button { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Button { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Button { - return mutate(key: key, value: value) + public func custom(key: String, value: Float) -> Button { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Button { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Button { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Button { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Button { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Button { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Button { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Button { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Button { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Button { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Button { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Button { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Button { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Button { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Button { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Button { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Button { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Button { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Button { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Button { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Button { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Button { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Button { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Button { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Button { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Button { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -1880,7 +2158,7 @@ public struct Fieldset: ContentNode, FormElement { internal var name: String { "fieldset" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -1895,7 +2173,7 @@ public struct Fieldset: ContentNode, FormElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -1924,165 +2202,197 @@ public struct Fieldset: ContentNode, FormElement { extension Fieldset: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, DisabledAttribute, FormAttribute, NameAttribute { public func accessKey(_ value: Character) -> Fieldset { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Fieldset { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Fieldset { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Fieldset { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Fieldset { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Fieldset { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Fieldset { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Fieldset { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Fieldset { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Fieldset { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Fieldset { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Fieldset { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Fieldset { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Fieldset { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Fieldset { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Fieldset { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Fieldset { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Fieldset { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Fieldset { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Fieldset { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Fieldset { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Fieldset { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Fieldset { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Fieldset { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Fieldset { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Fieldset { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Fieldset { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Fieldset { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Fieldset { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Fieldset { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Fieldset { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Fieldset { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Fieldset { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Fieldset { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Fieldset { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self @@ -2091,121 +2401,141 @@ extension Fieldset: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttribute public func disabled(_ condition: Bool = true) -> Fieldset { if condition { - return mutate(disabled: "disabled") + return mutate(disabled: .init("disabled", context: .trusted)) } return self } public func form(_ value: String) -> Fieldset { - return mutate(form: value) + return mutate(form: .init(value, context: .tainted(.html))) } public func name(_ value: String) -> Fieldset { - return mutate(name: value) + return mutate(name: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> Fieldset { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Fieldset { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Fieldset { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Fieldset { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Fieldset { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Fieldset { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Fieldset { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Fieldset { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Fieldset { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Fieldset { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Fieldset { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Fieldset { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Fieldset { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Fieldset { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Fieldset { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Fieldset { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Fieldset { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Fieldset { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Fieldset { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Fieldset { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Fieldset { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Fieldset { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Fieldset { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Fieldset { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Fieldset { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Fieldset { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Fieldset { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Fieldset { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Fieldset { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Fieldset { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Fieldset { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Fieldset { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/HeadElements.swift b/Sources/HTMLKit/Abstraction/Elements/HeadElements.swift index 4d3f04a9..6123f5e0 100644 --- a/Sources/HTMLKit/Abstraction/Elements/HeadElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/HeadElements.swift @@ -16,7 +16,7 @@ public struct Title: ContentNode, HeadElement, VectorElement { internal var name: String { "title" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -31,7 +31,7 @@ public struct Title: ContentNode, HeadElement, VectorElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -60,196 +60,248 @@ public struct Title: ContentNode, HeadElement, VectorElement { extension Title: GlobalAttributes, GlobalEventAttributes { public func accessKey(_ value: Character) -> Title { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Title { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Title { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Title { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Title { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Title { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Title { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Title { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Title { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Title { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Title { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Title { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Title { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Title { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Title { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Title { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Title { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Title { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Title { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Title { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Title { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Title { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Title { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Title { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Title { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Title { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Title { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Title { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Title { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Title { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Title { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Title { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Title { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Title { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Title { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Title { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> Title { - return mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Title { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Title { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Title { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Title { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Title { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Title { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Title { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Title { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Title { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Title { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Title { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -277,12 +329,12 @@ public struct Base: EmptyNode, HeadElement { internal var name: String { "base" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Create a base. public init() {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -308,204 +360,256 @@ public struct Base: EmptyNode, HeadElement { extension Base: GlobalAttributes, GlobalEventAttributes, ReferenceAttribute, TargetAttribute { public func accessKey(_ value: Character) -> Base { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Base { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Base { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Base { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Base { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Base { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Base { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Base { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Base { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Base { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Base { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Base { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Base { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Base { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Base { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Base { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Base { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Base { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Base { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Base { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Base { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Base { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Base { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Base { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Base { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Base { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Base { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Base { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Base { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Base { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Base { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Base { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Base { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Base { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Base { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func reference(_ value: String) -> Base { - return mutate(href: value) + return mutate(href: .init(value, context: .tainted(.url))) } public func target(_ value: Values.Target) -> Base { - return mutate(target: value.rawValue) + return mutate(target: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Base { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Base { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Base { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Base { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Base { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Base { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Base { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Base { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Base { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Base { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Base { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Base { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Base { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -523,12 +627,12 @@ public struct Meta: EmptyNode, HeadElement { internal var name: String { "meta" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Create a meta. public init() {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -554,165 +658,197 @@ public struct Meta: EmptyNode, HeadElement { extension Meta: GlobalAttributes, GlobalEventAttributes, ContentAttribute, NameAttribute, PropertyAttribute, CharsetAttribute, EquivalentAttribute { public func accessKey(_ value: Character) -> Meta { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Meta { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Meta { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Meta { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Meta { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Meta { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Meta { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Meta { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Meta { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Meta { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Meta { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Meta { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Meta { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Meta { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Meta { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Meta { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Meta { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Meta { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Meta { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Meta { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Meta { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Meta { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Meta { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Meta { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Meta { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Meta { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Meta { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Meta { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Meta { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Meta { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Meta { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Meta { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Meta { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Meta { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Meta { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self @@ -720,59 +856,79 @@ extension Meta: GlobalAttributes, GlobalEventAttributes, ContentAttribute, NameA @_disfavoredOverload public func content(_ value: String) -> Meta { - return mutate(content: value) + return mutate(content: .init(value, context: .tainted(.html))) } public func content(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Meta { - return mutate(content: LocalizedString(key: localizedKey, table: tableName)) + return mutate(content: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func content(verbatim value: String) -> Meta { - return mutate(content: value) + return mutate(content: .init(value, context: .tainted(.html))) } public func name(_ value: Values.Name) -> Meta { - return mutate(name: value.rawValue) + return mutate(name: .init(value.rawValue, context: .trusted)) } public func property(_ value: Values.Graph) -> Meta { - return mutate(property: value.rawValue) + return mutate(property: .init(value.rawValue, context: .trusted)) } public func charset(_ value: Values.Charset) -> Meta { - return mutate(charset: value.rawValue) + return mutate(charset: .init( value.rawValue, context: .trusted)) } public func equivalent(_ value: Values.Equivalent) -> Meta { - return mutate(httpequiv: value.rawValue) + return mutate(httpequiv: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Meta { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Meta { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Meta { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Meta { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Meta { - return mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> Meta { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Meta { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Meta { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Meta { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Meta { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Meta { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Meta { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Meta { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -789,7 +945,7 @@ public struct Style: ContentNode, HeadElement { internal var name: String { "style" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -814,7 +970,7 @@ public struct Style: ContentNode, HeadElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -843,216 +999,268 @@ public struct Style: ContentNode, HeadElement { extension Style: GlobalAttributes, GlobalEventAttributes, TypeAttribute, MediaAttribute, BlockingAttribute { public func accessKey(_ value: Character) -> Style { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Style { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Style { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Style { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Style { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Style { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Style { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Style { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Style { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Style { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Style { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Style { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Style { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Style { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Style { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Style { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Style { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Style { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Style { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Style { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Style { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Style { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Style { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Style { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Style { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Style { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Style { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Style { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Style { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Style { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Style { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Style { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Style { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Style { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Style { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func type(_ value: Values.Media) -> Style { - return mutate(type: value.rawValue) + return mutate(type: .init(value.rawValue, context: .trusted)) } public func media(_ value: String) -> Style { - return mutate(media: value) + return mutate(media: .init(value, context: .tainted(.html))) } public func media(_ queries: [MediaQuery]) -> Style { - return mutate(media: queries.map { $0.rawValue }.joined(separator: ", ")) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func media(_ queries: MediaQuery...) -> Style { - return mutate(media: queries.map { $0.rawValue }.joined(separator: ", ")) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func blocking(_ value: Values.Blocking) -> Style { - return mutate(blocking: value.rawValue) + return mutate(blocking: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Style { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Style { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Style { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Style { - return mutate(key: key, value: value) + public func custom(key: String, value: Double) -> Style { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Style { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Style { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Style { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Style { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Style { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Style { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Style { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Style { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -1069,12 +1277,12 @@ public struct Link: EmptyNode, HeadElement, BodyElement { internal var name: String { "link" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Create a link. public init() {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -1100,263 +1308,315 @@ public struct Link: EmptyNode, HeadElement, BodyElement { extension Link: GlobalAttributes, GlobalEventAttributes, ReferenceAttribute, ReferenceLanguageAttribute, MediaAttribute, ReferrerPolicyAttribute, RelationshipAttribute, SizesAttribute, TypeAttribute, FetchPriorityAttribute, BlockingAttribute, FormEventAttribute, IntegrityAttribute, AsAttribute, CrossOriginAttribute { public func accessKey(_ value: Character) -> Link { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func `as`(_ value: Values.Resource) -> Link { - return mutate(as: value.rawValue) + return mutate(as: .init(value.rawValue, context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Link { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Link { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Link { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } public func crossOrigin(_ value: Credential.Mode) -> Link { - return mutate(crossorigin: value.rawValue) + return mutate(crossorigin: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Link { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Link { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Link { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Link { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Link { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Link { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Link { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Link { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Link { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func integrity(_ hashes: String...) -> Link { - return mutate(integrity: hashes.joined(separator: " ")) + return mutate(integrity: .init(hashes.joined(separator: " "), context: .tainted(.html))) } public func integrity(_ hashes: [String]) -> Link { - return mutate(integrity: hashes.joined(separator: " ")) + return mutate(integrity: .init(hashes.joined(separator: " "), context: .tainted(.html))) } public func `is`(_ value: String) -> Link { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Link { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Link { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Link { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Link { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Link { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Link { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Link { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Link { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Link { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Link { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Link { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Link { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Link { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Link { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Link { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Link { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Link { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Link { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Link { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Link { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Link { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func reference(_ value: String) -> Link { - return mutate(href: value) + return mutate(href: .init(value, context: .tainted(.url))) } public func referenceLanguage(_ value: Values.Language) -> Link { - return mutate(hreflang: value.rawValue) + return mutate(hreflang: .init(value.rawValue, context: .trusted)) } public func media(_ value: String) -> Link { - return mutate(media: value) + return mutate(media: .init(value, context: .tainted(.html))) } public func media(_ queries: [MediaQuery]) -> Link { - return mutate(media: queries.map { $0.rawValue }.joined(separator: ", ")) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func media(_ queries: MediaQuery...) -> Link { - return mutate(media: queries.map { $0.rawValue }.joined(separator: ", ")) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func referrerPolicy(_ value: Values.Policy) -> Link { - return mutate(referrerpolicy: value.rawValue) + return mutate(referrerpolicy: .init(value.rawValue, context: .trusted)) } public func relationship(_ value: Values.Relation) -> Link { - return mutate(rel: value.rawValue) + return mutate(rel: .init(value.rawValue, context: .trusted)) } public func sizes(_ candidates: [String]) -> Link { - return mutate(sizes: candidates.map { $0 }.joined(separator: " ")) + return mutate(sizes: .init(candidates.map { $0 }.joined(separator: " "), context: .tainted(.html))) } public func sizes(_ candidates: String...) -> Link { - return mutate(sizes: candidates.map { $0 }.joined(separator: " ")) + return mutate(sizes: .init(candidates.map { $0 }.joined(separator: " "), context: .tainted(.html))) } public func type(_ value: Values.Media) -> Link { - return mutate(type: value.rawValue) + return mutate(type: .init(value.rawValue, context: .trusted)) } public func fetchPriority(_ value: Values.Priority) -> Link { - return mutate(fetchpriority: value.rawValue) + return mutate(fetchpriority: .init(value.rawValue, context: .trusted)) } public func blocking(_ value: Values.Blocking) -> Link { - return mutate(blocking: value.rawValue) + return mutate(blocking: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Link { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Link { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Link { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Link { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Link { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Link { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Link { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Link { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Form, _ value: String) -> Link { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Drag, _ value: String) -> Link { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Link { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Link { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Link { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Link { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/HtmlElements.swift b/Sources/HTMLKit/Abstraction/Elements/HtmlElements.swift index 57a3ba5d..5af2d155 100644 --- a/Sources/HTMLKit/Abstraction/Elements/HtmlElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/HtmlElements.swift @@ -14,7 +14,7 @@ public struct Head: ContentNode, HtmlElement { internal var name: String { "head" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [HeadElement] @@ -29,7 +29,7 @@ public struct Head: ContentNode, HtmlElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [HeadElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [HeadElement]) { self.attributes = attributes self.context = context @@ -58,196 +58,248 @@ public struct Head: ContentNode, HtmlElement { extension Head: GlobalAttributes, GlobalEventAttributes { public func accessKey(_ value: Character) -> Head { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Head { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Head { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Head { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Head { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Head { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Head { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Head { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Head { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Head { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Head { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Head { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Head { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Head { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Head { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Head { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Head { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Head { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Head { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Head { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Head { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Head { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Head { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Head { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Head { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Head { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Head { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Head { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Head { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Head { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Head { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Head { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Head { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Head { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Head { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Head { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Head { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Head { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Head { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Head { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Head { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Head { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Head { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Head { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Head { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Head { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Head { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Head { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -269,7 +321,7 @@ public struct Body: ContentNode, HtmlElement { internal var name: String { "body" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [BodyElement] @@ -284,7 +336,7 @@ public struct Body: ContentNode, HtmlElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [BodyElement]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [BodyElement]) { self.attributes = attributes self.context = context @@ -313,275 +365,327 @@ public struct Body: ContentNode, HtmlElement { extension Body: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, WindowEventAttribute { public func accessKey(_ value: Character) -> Body { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Body { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Body { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Body { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Body { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Body { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Body { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Body { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Body { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Body { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Body { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Body { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Body { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Body { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Body { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Body { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Body { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Body { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Body { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Body { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Body { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Body { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Body { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Body { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Body { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Body { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Body { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Body { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Body { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Body { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Body { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Body { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Body { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Body { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Body { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Body { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Body { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Body { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Body { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Body { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Body { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Body { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Body { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Body { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Body { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Window, _ value: String) -> Body { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Body { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Body { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Body { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Body { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Body { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Body { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Body { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Body { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Body { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Body { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Body { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Body { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Body { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Body { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Body { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Body { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Body { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Body { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Body { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Body { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Body { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Body { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/InputElements.swift b/Sources/HTMLKit/Abstraction/Elements/InputElements.swift index ab14de11..e2863f28 100644 --- a/Sources/HTMLKit/Abstraction/Elements/InputElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/InputElements.swift @@ -29,7 +29,7 @@ public struct OptionGroup: ContentNode, InputElement { internal var name: String { "optgroup" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -44,7 +44,7 @@ public struct OptionGroup: ContentNode, InputElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -73,165 +73,197 @@ public struct OptionGroup: ContentNode, InputElement { extension OptionGroup: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, DisabledAttribute, LabelAttribute { public func accessKey(_ value: Character) -> OptionGroup { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> OptionGroup { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> OptionGroup { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> OptionGroup { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> OptionGroup { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> OptionGroup { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> OptionGroup { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> OptionGroup { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> OptionGroup { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> OptionGroup { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> OptionGroup { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> OptionGroup { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> OptionGroup { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> OptionGroup { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> OptionGroup { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> OptionGroup { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> OptionGroup { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> OptionGroup { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> OptionGroup { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> OptionGroup { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> OptionGroup { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> OptionGroup { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> OptionGroup { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> OptionGroup { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> OptionGroup { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> OptionGroup { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> OptionGroup { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> OptionGroup { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> OptionGroup { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> OptionGroup { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(verbatim value: String) -> OptionGroup { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> OptionGroup { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> OptionGroup { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> OptionGroup { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> OptionGroup { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self @@ -240,7 +272,7 @@ extension OptionGroup: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttrib public func disabled(_ condition: Bool = true) -> OptionGroup { if condition { - return mutate(disabled: "disabled") + return mutate(disabled: .init("disabled", context: .trusted)) } return self @@ -248,119 +280,139 @@ extension OptionGroup: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttrib @_disfavoredOverload public func label(_ value: String) -> OptionGroup { - return mutate(label: value) + return mutate(label: .init(value, context: .tainted(.html))) } public func label(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> OptionGroup { - return mutate(label: LocalizedString(key: localizedKey, table: tableName)) + return mutate(label: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func label(verbatim value: String) -> OptionGroup { - return mutate(label: value) + return mutate(label: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> OptionGroup { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> OptionGroup { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> OptionGroup { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> OptionGroup { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> OptionGroup { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> OptionGroup { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> OptionGroup { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> OptionGroup { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> OptionGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> OptionGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> OptionGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> OptionGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> OptionGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> OptionGroup { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> OptionGroup { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> OptionGroup { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> OptionGroup { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> OptionGroup { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> OptionGroup { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> OptionGroup { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> OptionGroup { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> OptionGroup { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> OptionGroup { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> OptionGroup { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> OptionGroup { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> OptionGroup { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> OptionGroup { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> OptionGroup { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> OptionGroup { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> OptionGroup { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> OptionGroup { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> OptionGroup { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -380,7 +432,7 @@ public struct Option: ContentNode, InputElement { internal var name: String { "option" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [String] @@ -395,7 +447,7 @@ public struct Option: ContentNode, InputElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [String]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [String]) { self.attributes = attributes self.context = context @@ -424,165 +476,197 @@ public struct Option: ContentNode, InputElement { extension Option: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, DisabledAttribute, LabelAttribute, ValueAttribute, SelectedAttribute { public func accessKey(_ value: Character) -> Option { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Option { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Option { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Option { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Option { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Option { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Option { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Option { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Option { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Option { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Option { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Option { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Option { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Option { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Option { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Option { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Option { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Option { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Option { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Option { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Option { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Option { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Option { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Option { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Option { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Option { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Option { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Option { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Option { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Option { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Option { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Option { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Option { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Option { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Option { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self @@ -591,7 +675,7 @@ extension Option: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, public func disabled(_ condition: Bool = true) -> Option { if condition { - return mutate(disabled: "disabled") + return mutate(disabled: .init("disabled", context: .trusted)) } return self @@ -599,141 +683,161 @@ extension Option: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, @_disfavoredOverload public func label(_ value: String) -> Option { - return mutate(label: value) + return mutate(label: .init(value, context: .tainted(.html))) } public func label(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Option { - return mutate(label: LocalizedString(key: localizedKey, table: tableName)) + return mutate(label: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func label(verbatim value: String) -> Option { - return mutate(label: value) + return mutate(label: .init(value, context: .tainted(.html))) } @_disfavoredOverload public func value(_ value: String) -> Option { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func value(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Option { - return mutate(value: LocalizedString(key: localizedKey, table: tableName)) + return mutate(value: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func value(verbatim value: String) -> Option { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func selected(_ condition: Bool = true) -> Option { if condition { - return mutate(selected: "selected") + return mutate(selected: .init("selected", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Option { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Option { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Option { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Option { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Option { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Option { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Option { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Option { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Option { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Option { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Option { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Option { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Option { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Option { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Option { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Option { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Option { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Option { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Option { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Option { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Option { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Option { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Option { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Option { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Option { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Option { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Option { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Option { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Option { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Option { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Option { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Option { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -763,7 +867,7 @@ public struct Legend: ContentNode, InputElement { internal var name: String { "legend" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -778,7 +882,7 @@ public struct Legend: ContentNode, InputElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -807,272 +911,324 @@ public struct Legend: ContentNode, InputElement { extension Legend: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Legend { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Legend { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Legend { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Legend { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Legend { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Legend { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Legend { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Legend { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Legend { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Legend { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Legend { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Legend { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Legend { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Legend { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Legend { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Legend { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Legend { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Legend { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Legend { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Legend { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Legend { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Legend { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Legend { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Legend { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Legend { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Legend { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Legend { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Legend { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Legend { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Legend { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Legend { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Legend { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Legend { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Legend { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Legend { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Legend { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Legend { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Legend { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Legend { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Legend { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Legend { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Legend { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Legend { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Legend { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Legend { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Legend { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Legend { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Legend { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Legend { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Legend { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Legend { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Legend { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Legend { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Legend { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Legend { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Legend { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Legend { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Legend { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Legend { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Legend { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Legend { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Legend { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Legend { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Legend { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Legend { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Legend { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Legend { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -1094,7 +1250,7 @@ public struct Summary: ContentNode, InputElement { internal var name: String { "summary" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -1109,7 +1265,7 @@ public struct Summary: ContentNode, InputElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -1138,271 +1294,323 @@ public struct Summary: ContentNode, InputElement { extension Summary: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Summary { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Summary { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Summary { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Summary { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Summary { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Summary { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Summary { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Summary { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Summary { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Summary { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Summary { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Summary { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Summary { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Summary { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Summary { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Summary { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Summary { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Summary { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Summary { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Summary { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Summary { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Summary { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Summary { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Summary { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Summary { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Summary { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Summary { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Summary { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Summary { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Summary { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Summary { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Summary { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Summary { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Summary { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Summary { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Summary { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Summary { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Summary { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Summary { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Summary { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Summary { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Summary { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Summary { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Summary { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Summary { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Summary { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Summary { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Summary { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Summary { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Summary { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Summary { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Summary { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Summary { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Summary { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Summary { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Summary { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Summary { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Summary { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Summary { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Summary { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Summary { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Summary { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Summary { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Summary { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Summary { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Summary { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Summary { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/ListElements.swift b/Sources/HTMLKit/Abstraction/Elements/ListElements.swift index ff16fe2e..cb600ca9 100644 --- a/Sources/HTMLKit/Abstraction/Elements/ListElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/ListElements.swift @@ -23,7 +23,7 @@ public struct ListItem: ContentNode, ListElement { internal var name: String { "li" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -38,7 +38,7 @@ public struct ListItem: ContentNode, ListElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -67,165 +67,197 @@ public struct ListItem: ContentNode, ListElement { extension ListItem: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, ValueAttribute { public func accessKey(_ value: Character) -> ListItem { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> ListItem { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> ListItem { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> ListItem { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> ListItem { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> ListItem { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> ListItem { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> ListItem { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> ListItem { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> ListItem { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> ListItem { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> ListItem { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> ListItem { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> ListItem { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> ListItem { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> ListItem { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> ListItem { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> ListItem { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> ListItem { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> ListItem { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> ListItem { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> ListItem { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> ListItem { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> ListItem { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> ListItem { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> ListItem { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> ListItem { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> ListItem { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> ListItem { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> ListItem { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> ListItem { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> ListItem { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> ListItem { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> ListItem { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> ListItem { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self @@ -233,118 +265,138 @@ extension ListItem: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttribute @_disfavoredOverload public func value(_ value: String) -> ListItem { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func value(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> ListItem { - return mutate(value: LocalizedString(key: localizedKey, table: tableName)) + return mutate(value: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func value(verbatim value: String) -> ListItem { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> ListItem { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> ListItem { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> ListItem { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> ListItem { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> ListItem { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> ListItem { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> ListItem { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> ListItem { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> ListItem { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> ListItem { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> ListItem { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> ListItem { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> ListItem { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> ListItem { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> ListItem { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> ListItem { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> ListItem { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> ListItem { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> ListItem { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> ListItem { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> ListItem { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> ListItem { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> ListItem { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> ListItem { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> ListItem { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> ListItem { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> ListItem { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> ListItem { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> ListItem { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> ListItem { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> ListItem { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> ListItem { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/MapElements.swift b/Sources/HTMLKit/Abstraction/Elements/MapElements.swift index ed615053..4f0891a6 100644 --- a/Sources/HTMLKit/Abstraction/Elements/MapElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/MapElements.swift @@ -21,7 +21,7 @@ public struct Area: EmptyNode, MapElement { internal var name: String { "area" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Creates a area. public init() {} @@ -29,7 +29,7 @@ public struct Area: EmptyNode, MapElement { @available(*, deprecated, message: "The area element is actually an empty element. Use Area() instead.") public init(@ContentBuilder content: () -> [Content]) {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -55,165 +55,197 @@ public struct Area: EmptyNode, MapElement { extension Area: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, AlternateAttribute, CoordinatesAttribute, ShapeAttribute, ReferenceAttribute, TargetAttribute, DownloadAttribute, PingAttribute, RelationshipAttribute, ReferrerPolicyAttribute { public func accessKey(_ value: Character) -> Area { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Area { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Area { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Area { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Area { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Area { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Area { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Area { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Area { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Area { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Area { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Area { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Area { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Area { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Area { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Area { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Area { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Area { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Area { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Area { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Area { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Area { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Area { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Area { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Area { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Area { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Area { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Area { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Area { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Area { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Area { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Area { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Area { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Area { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Area { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self @@ -221,160 +253,180 @@ extension Area: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, A @_disfavoredOverload public func alternate(_ value: String) -> Area { - return mutate(alternate: value) + return mutate(alternate: .init(value, context: .tainted(.html))) } public func alternate(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Area { - return mutate(alternate: LocalizedString(key: localizedKey, table: tableName)) + return mutate(alternate: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func alternate(verbatim value: String) -> Area { - return mutate(alternate: value) + return mutate(alternate: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the shape(_:coordinates:) modifier instead.") public func coordinates(_ value: String) -> Area { - return mutate(coords: value) + return mutate(coords: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the shape(_:coordinates:) modifier instead.") public func shape(_ value: Values.Shape) -> Area { - return mutate(shape: value.rawValue) + return mutate(shape: .init(value.rawValue, context: .trusted)) } public func shape() -> Area { - return mutate(shape: "default") + return mutate(shape: .init("default", context: .trusted)) } public func shape(_ value: Values.Shape, coordinates: String) -> Area { - return mutate(shape: value.rawValue).mutate(coords: coordinates) + return mutate(shape: .init(value.rawValue, context: .trusted)).mutate(coords: .init(coordinates, context: .tainted(.html))) } public func reference(_ value: String) -> Area { - return mutate(href: value) + return mutate(href: .init(value, context: .tainted(.url))) } public func target(_ value: Values.Target) -> Area { - return mutate(target: value.rawValue) + return mutate(target: .init(value.rawValue, context: .trusted)) } public func download() -> Area { - return mutate(download: "download") + return mutate(download: .init("download", context: .trusted)) } public func ping(_ value: String) -> Area { - return mutate(ping: value) + return mutate(ping: .init(value, context: .tainted(.html))) } public func relationship(_ value: Values.Relation) -> Area { - return mutate(rel: value.rawValue) + return mutate(rel: .init(value.rawValue, context: .trusted)) } public func referrerPolicy(_ value: Values.Policy) -> Area { - return mutate(referrerpolicy: value.rawValue) + return mutate(referrerpolicy: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Area { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Area { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Area { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Area { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Area { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Area { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Area { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Area { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Area { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Area { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Area { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Area { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Area { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Area { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Area { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Area { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Area { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Area { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Area { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Area { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Area { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Area { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Area { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Area { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Area { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Area { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Area { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Area { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Area { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Area { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Area { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Area { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/MediaElements.swift b/Sources/HTMLKit/Abstraction/Elements/MediaElements.swift index 3d48c021..3fdaaf10 100644 --- a/Sources/HTMLKit/Abstraction/Elements/MediaElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/MediaElements.swift @@ -17,12 +17,12 @@ public struct Source: EmptyNode, MediaElement { internal var name: String { "source" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Create a source. public init() {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -48,249 +48,301 @@ public struct Source: EmptyNode, MediaElement { extension Source: GlobalAttributes, GlobalEventAttributes, TypeAttribute, SourceAttribute, SizesAttribute, MediaAttribute, WidthAttribute, HeightAttribute, SourceSetAttribute { public func accessKey(_ value: Character) -> Source { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Source { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Source { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Source { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Source { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Source { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Source { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Source { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Source { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Source { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Source { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Source { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Source { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Source { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Source { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Source { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Source { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Source { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Source { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Source { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Source { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Source { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Source { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Source { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Source { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Source { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Source { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Source { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Source { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Source { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Source { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Source { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Source { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Source { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Source { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func type(_ value: Values.Media) -> Source { - return mutate(type: value.rawValue) + return mutate(type: .init(value.rawValue, context: .trusted)) } public func source(_ value: String) -> Source { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func source(_ value: EnvironmentValue) -> Source { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the sourceSet(_:) modifier instead.") public func sourceSet(_ value: String) -> Source { - return mutate(sourceset: value) + return mutate(sourceset: .init(value, context: .tainted(.html))) } public func sourceSet(_ candidates: [SourceCandidate]) -> Source { - return mutate(sourceset: candidates.map { $0.rawValue }.joined(separator: ", ")) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func sourceSet(_ candidates: SourceCandidate...) -> Source { - return mutate(sourceset: candidates.map { $0.rawValue }.joined(separator: ", ")) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func sizes(_ candidates: [SizeCandidate]) -> Source { - return mutate(sizes: candidates.map { $0.rawValue }.joined(separator: ", ")) + return mutate(sizes: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func sizes(_ candidates: SizeCandidate...) -> Source { - return mutate(sizes: candidates.map { $0.rawValue }.joined(separator: ", ")) + return mutate(sizes: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func media(_ value: String) -> Source { - return mutate(media: value) + return mutate(media: .init(value, context: .tainted(.html))) } public func media(_ queries: [MediaQuery]) -> Source { - return mutate(media: queries.map { $0.rawValue }.joined(separator: ", ")) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func media(_ queries: MediaQuery...) -> Source { - return mutate(media: queries.map { $0.rawValue }.joined(separator: ", ")) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } public func width(_ size: Int) -> Source { - return mutate(width: size) + return mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> Source { - return mutate(height: size) + return mutate(height: .init(size, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Source { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Source { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Source { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Source { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Source { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Source { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Source { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Source { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Source { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Source { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Source { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Source { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Source { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -313,12 +365,12 @@ public struct Track: EmptyNode, MediaElement { internal var name: String { "track" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Create a track. public init() {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -344,228 +396,280 @@ public struct Track: EmptyNode, MediaElement { extension Track: GlobalAttributes, GlobalEventAttributes, KindAttribute, SourceAttribute, LabelAttribute, DefaultAttribute, SourceLanguageAttribute { public func accessKey(_ value: Character) -> Track { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Track { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Track { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Track { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Track { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Track { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Track { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Track { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Track { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Track { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Track { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Track { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Track { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Track { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Track { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Track { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Track { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Track { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Track { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Track { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Track { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Track { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Track { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Track { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Track { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Track { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Track { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Track { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Track { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Track { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Track { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Track { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Track { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Track { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Track { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func kind(_ value: Values.Kind) -> Track { - return mutate(kind: value.rawValue) + return mutate(kind: .init(value.rawValue, context: .trusted)) } public func source(_ value: String) -> Track { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func source(_ value: EnvironmentValue) -> Track { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } public func sourceLanguage(_ value: Values.Language) -> Track { - return mutate(sourcelanguage: value.rawValue) + return mutate(sourcelanguage: .init(value.rawValue, context: .trusted)) } @_disfavoredOverload public func label(_ value: String) -> Track { - return mutate(label: value) + return mutate(label: .init(value, context: .tainted(.html))) } public func label(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Track { - return mutate(label: LocalizedString(key: localizedKey, table: tableName)) + return mutate(label: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func label(verbatim value: String) -> Track { - return mutate(label: value) + return mutate(label: .init(value, context: .tainted(.html))) } public func `default`() -> Track { - return mutate(default: "default") + return mutate(default: .init("default", context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Track { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Track { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Track { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Track { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Track { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Track { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Track { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Track { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Track { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Track { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Track { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Track { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Track { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/ObjectElements.swift b/Sources/HTMLKit/Abstraction/Elements/ObjectElements.swift index 47b1b533..fe1df225 100644 --- a/Sources/HTMLKit/Abstraction/Elements/ObjectElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/ObjectElements.swift @@ -20,12 +20,12 @@ public struct Parameter: EmptyNode, ObjectElement { internal var name: String { "param" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? @available(*, unavailable, message: "Use the data attribute of the object element instead.") public init() {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -51,212 +51,264 @@ public struct Parameter: EmptyNode, ObjectElement { extension Parameter: GlobalAttributes, GlobalEventAttributes, NameAttribute, ValueAttribute { public func accessKey(_ value: Character) -> Parameter { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Parameter { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Parameter { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Parameter { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Parameter { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Parameter { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Parameter { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Parameter { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Parameter { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Parameter { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Parameter { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Parameter { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Parameter { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Parameter { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Parameter { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Parameter { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Parameter { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Parameter { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Parameter { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Parameter { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Parameter { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Parameter { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Parameter { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Parameter { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Parameter { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Parameter { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Parameter { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Parameter { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Parameter { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Parameter { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Parameter { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Parameter { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Parameter { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Parameter { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Parameter { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func name(_ value: String) -> Parameter { - return mutate(name: value) + return mutate(name: .init(value, context: .tainted(.html))) } @_disfavoredOverload public func value(_ value: String) -> Parameter { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func value(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Parameter { - return mutate(value: LocalizedString(key: localizedKey, table: tableName)) + return mutate(value: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func value(verbatim value: String) -> Parameter { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> Parameter { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Parameter { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Parameter { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Parameter { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Parameter { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Parameter { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Parameter { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Parameter { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Parameter { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Parameter { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Parameter { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Parameter { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Parameter { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/RubyElements.swift b/Sources/HTMLKit/Abstraction/Elements/RubyElements.swift index add43bae..65a59ff4 100644 --- a/Sources/HTMLKit/Abstraction/Elements/RubyElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/RubyElements.swift @@ -25,7 +25,7 @@ public struct RubyText: ContentNode, RubyElement { internal var name: String { "rt" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -40,7 +40,7 @@ public struct RubyText: ContentNode, RubyElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -69,272 +69,324 @@ public struct RubyText: ContentNode, RubyElement { extension RubyText: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> RubyText { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> RubyText { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> RubyText { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> RubyText { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> RubyText { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> RubyText { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> RubyText { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> RubyText { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> RubyText { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> RubyText { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> RubyText { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> RubyText { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> RubyText { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> RubyText { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> RubyText { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> RubyText { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> RubyText { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> RubyText { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> RubyText { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> RubyText { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> RubyText { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> RubyText { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> RubyText { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> RubyText { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> RubyText { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> RubyText { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> RubyText { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> RubyText { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> RubyText { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> RubyText { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> RubyText { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> RubyText { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> RubyText { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> RubyText { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> RubyText { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> RubyText { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> RubyText { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> RubyText { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> RubyText { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> RubyText { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> RubyText { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> RubyText { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> RubyText { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> RubyText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> RubyText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> RubyText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> RubyText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> RubyText { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> RubyText { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> RubyText { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> RubyText { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> RubyText { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> RubyText { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> RubyText { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> RubyText { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> RubyText { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> RubyText { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> RubyText { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> RubyText { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> RubyText { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> RubyText { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> RubyText { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> RubyText { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> RubyText { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> RubyText { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> RubyText { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> RubyText { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -360,7 +412,7 @@ public struct RubyPronunciation: ContentNode, RubyElement { internal var name: String { "rp" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -375,7 +427,7 @@ public struct RubyPronunciation: ContentNode, RubyElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -404,272 +456,324 @@ public struct RubyPronunciation: ContentNode, RubyElement { extension RubyPronunciation: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> RubyPronunciation { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> RubyPronunciation { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> RubyPronunciation { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> RubyPronunciation { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> RubyPronunciation { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> RubyPronunciation { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> RubyPronunciation { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> RubyPronunciation { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> RubyPronunciation { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> RubyPronunciation { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> RubyPronunciation { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> RubyPronunciation { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> RubyPronunciation { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> RubyPronunciation { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> RubyPronunciation { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> RubyPronunciation { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> RubyPronunciation { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> RubyPronunciation { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> RubyPronunciation { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> RubyPronunciation { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> RubyPronunciation { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> RubyPronunciation { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> RubyPronunciation { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> RubyPronunciation { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> RubyPronunciation { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> RubyPronunciation { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func spellcheck(_ value: Bool = true) -> RubyPronunciation { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> RubyPronunciation { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> RubyPronunciation { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> RubyPronunciation { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> RubyPronunciation { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> RubyPronunciation { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> RubyPronunciation { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> RubyPronunciation { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> RubyPronunciation { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> RubyPronunciation { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> RubyPronunciation { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> RubyPronunciation { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> RubyPronunciation { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> RubyPronunciation { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> RubyPronunciation { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> RubyPronunciation { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> RubyPronunciation { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> RubyPronunciation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> RubyPronunciation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> RubyPronunciation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> RubyPronunciation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> RubyPronunciation { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> RubyPronunciation { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> RubyPronunciation { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> RubyPronunciation { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> RubyPronunciation { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> RubyPronunciation { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> RubyPronunciation { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> RubyPronunciation { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> RubyPronunciation { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> RubyPronunciation { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> RubyPronunciation { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> RubyPronunciation { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> RubyPronunciation { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> RubyPronunciation { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> RubyPronunciation { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> RubyPronunciation { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> RubyPronunciation { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> RubyPronunciation { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> RubyPronunciation { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> RubyPronunciation { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/TableElements.swift b/Sources/HTMLKit/Abstraction/Elements/TableElements.swift index eec5adce..b7b3cbc4 100644 --- a/Sources/HTMLKit/Abstraction/Elements/TableElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/TableElements.swift @@ -48,7 +48,7 @@ public struct Caption: ContentNode, TableElement { internal var name: String { "caption" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -63,7 +63,7 @@ public struct Caption: ContentNode, TableElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -92,272 +92,324 @@ public struct Caption: ContentNode, TableElement { extension Caption: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> Caption { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Caption { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Caption { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Caption { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Caption { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Caption { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Caption { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Caption { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Caption { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Caption { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Caption { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Caption { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Caption { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Caption { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Caption { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Caption { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Caption { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Caption { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Caption { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Caption { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Caption { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Caption { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Caption { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Caption { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Caption { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Caption { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Caption { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Caption { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Caption { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Caption { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Caption { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Caption { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Caption { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Caption { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Caption { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> Caption { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Caption { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Caption { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Caption { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Caption { - return mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> Caption { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Caption { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Caption { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Caption { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Caption { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Caption { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Caption { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Caption { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> Caption { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> Caption { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> Caption { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> Caption { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> Caption { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> Caption { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> Caption { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> Caption { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> Caption { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> Caption { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> Caption { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> Caption { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> Caption { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> Caption { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> Caption { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> Caption { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> Caption { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> Caption { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> Caption { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -378,7 +430,7 @@ public struct ColumnGroup: ContentNode, TableElement { internal var name: String { "colgroup" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -393,7 +445,7 @@ public struct ColumnGroup: ContentNode, TableElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -422,200 +474,252 @@ public struct ColumnGroup: ContentNode, TableElement { extension ColumnGroup: GlobalAttributes, GlobalEventAttributes, SpanAttribute { public func accessKey(_ value: Character) -> ColumnGroup { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> ColumnGroup { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> ColumnGroup { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> ColumnGroup { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> ColumnGroup { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> ColumnGroup { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> ColumnGroup { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> ColumnGroup { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> ColumnGroup { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> ColumnGroup { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> ColumnGroup { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> ColumnGroup { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> ColumnGroup { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> ColumnGroup { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> ColumnGroup { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> ColumnGroup { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> ColumnGroup { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> ColumnGroup { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> ColumnGroup { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> ColumnGroup { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> ColumnGroup { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> ColumnGroup { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> ColumnGroup { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> ColumnGroup { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> ColumnGroup { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> ColumnGroup { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> ColumnGroup { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> ColumnGroup { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> ColumnGroup { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> ColumnGroup { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> ColumnGroup { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> ColumnGroup { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> ColumnGroup { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> ColumnGroup { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> ColumnGroup { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func span(_ size: Int) -> ColumnGroup { - return mutate(span: size) + return mutate(span: .init(size, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> ColumnGroup { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> ColumnGroup { + return mutate(key: key, value: .init(value, context: context)) } - public func custom(key: String, value: Any) -> ColumnGroup { - return mutate(key: key, value: value) + public func custom(key: String, value: Int) -> ColumnGroup { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> ColumnGroup { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> ColumnGroup { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> ColumnGroup { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> ColumnGroup { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> ColumnGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> ColumnGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> ColumnGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> ColumnGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> ColumnGroup { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -637,7 +741,7 @@ public struct Column: EmptyNode, TableElement { internal var name: String { "col" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? /// Create a column. public init() {} @@ -645,7 +749,7 @@ public struct Column: EmptyNode, TableElement { @available(*, deprecated, message: "The column element is actually an empty element. Use Column() instead.") public init(@ContentBuilder content: () -> [Content]) {} - internal init(attributes: OrderedDictionary?) { + internal init(attributes: OrderedDictionary?) { self.attributes = attributes } @@ -671,200 +775,252 @@ public struct Column: EmptyNode, TableElement { extension Column: GlobalAttributes, GlobalEventAttributes, SpanAttribute { public func accessKey(_ value: Character) -> Column { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> Column { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> Column { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> Column { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> Column { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> Column { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> Column { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> Column { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> Column { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> Column { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> Column { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> Column { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> Column { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> Column { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Column { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Column { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> Column { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> Column { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> Column { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> Column { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> Column { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> Column { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> Column { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> Column { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> Column { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> Column { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> Column { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> Column { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> Column { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> Column { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Column { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> Column { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> Column { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> Column { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> Column { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func span(_ size: Int) -> Column { - return mutate(span: size) + return mutate(span: .init(size, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> Column { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Column { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Column { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Column { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Column { - return mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> Column { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Column { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Column { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> Column { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> Column { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> Column { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> Column { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> Column { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } } @@ -886,7 +1042,7 @@ public struct TableBody: ContentNode, TableElement { internal var name: String { "tbody" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -901,7 +1057,7 @@ public struct TableBody: ContentNode, TableElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -930,280 +1086,332 @@ public struct TableBody: ContentNode, TableElement { extension TableBody: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, WidthAttribute, HeightAttribute { public func accessKey(_ value: Character) -> TableBody { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> TableBody { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> TableBody { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> TableBody { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> TableBody { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> TableBody { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> TableBody { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> TableBody { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> TableBody { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> TableBody { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> TableBody { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> TableBody { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> TableBody { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> TableBody { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> TableBody { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> TableBody { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> TableBody { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> TableBody { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> TableBody { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> TableBody { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> TableBody { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> TableBody { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> TableBody { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> TableBody { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> TableBody { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> TableBody { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> TableBody { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> TableBody { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> TableBody { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> TableBody { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> TableBody { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> TableBody { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> TableBody { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> TableBody { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> TableBody { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func width(_ size: Int) -> TableBody { - return mutate(width: size) + return mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> TableBody { - return mutate(height: size) + return mutate(height: .init(size, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> TableBody { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> TableBody { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> TableBody { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> TableBody { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> TableBody { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> TableBody { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> TableBody { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> TableBody { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> TableBody { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> TableBody { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> TableBody { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> TableBody { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> TableBody { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> TableBody { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> TableBody { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> TableBody { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> TableBody { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> TableBody { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> TableBody { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> TableBody { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> TableBody { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> TableBody { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> TableBody { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> TableBody { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> TableBody { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> TableBody { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> TableBody { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> TableBody { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> TableBody { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> TableBody { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> TableBody { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> TableBody { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -1233,7 +1441,7 @@ public struct TableHead: ContentNode, TableElement { internal var name: String { "thead" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -1248,7 +1456,7 @@ public struct TableHead: ContentNode, TableElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -1277,280 +1485,332 @@ public struct TableHead: ContentNode, TableElement { extension TableHead: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, WidthAttribute, HeightAttribute { public func accessKey(_ value: Character) -> TableHead { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> TableHead { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> TableHead { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> TableHead { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> TableHead { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> TableHead { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> TableHead { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> TableHead { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> TableHead { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> TableHead { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> TableHead { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> TableHead { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> TableHead { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> TableHead { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> TableHead { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> TableHead { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> TableHead { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> TableHead { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> TableHead { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> TableHead { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> TableHead { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> TableHead { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> TableHead { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> TableHead { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> TableHead { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> TableHead { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> TableHead { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> TableHead { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> TableHead { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> TableHead { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> TableHead { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> TableHead { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> TableHead { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> TableHead { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> TableHead { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func width(_ size: Int) -> TableHead { - return mutate(width: size) + return mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> TableHead { - return mutate(height: size) + return mutate(height: .init(size, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> TableHead { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> TableHead { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> TableHead { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> TableHead { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> TableHead { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> TableHead { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> TableHead { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> TableHead { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> TableHead { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> TableHead { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> TableHead { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> TableHead { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> TableHead { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> TableHead { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> TableHead { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> TableHead { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> TableHead { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> TableHead { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> TableHead { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> TableHead { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> TableHead { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> TableHead { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> TableHead { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> TableHead { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> TableHead { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> TableHead { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> TableHead { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> TableHead { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> TableHead { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> TableHead { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> TableHead { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> TableHead { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -1580,7 +1840,7 @@ public struct TableFoot: ContentNode, TableElement { internal var name: String { "tfoot" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -1595,7 +1855,7 @@ public struct TableFoot: ContentNode, TableElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -1624,272 +1884,324 @@ public struct TableFoot: ContentNode, TableElement { extension TableFoot: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes { public func accessKey(_ value: Character) -> TableFoot { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> TableFoot { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> TableFoot { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> TableFoot { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> TableFoot { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> TableFoot { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> TableFoot { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> TableFoot { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> TableFoot { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> TableFoot { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> TableFoot { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> TableFoot { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> TableFoot { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> TableFoot { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> TableFoot { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> TableFoot { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> TableFoot { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> TableFoot { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> TableFoot { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> TableFoot { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> TableFoot { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> TableFoot { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> TableFoot { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> TableFoot { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> TableFoot { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> TableFoot { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> TableFoot { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> TableFoot { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> TableFoot { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> TableFoot { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> TableFoot { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> TableFoot { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> TableFoot { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> TableFoot { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> TableFoot { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func popover(_ value: Values.Popover.State) -> TableFoot { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> TableFoot { - return mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> TableFoot { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> TableFoot { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> TableFoot { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> TableFoot { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> TableFoot { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> TableFoot { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> TableFoot { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> TableFoot { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> TableFoot { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> TableFoot { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> TableFoot { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> TableFoot { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> TableFoot { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> TableFoot { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> TableFoot { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> TableFoot { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> TableFoot { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> TableFoot { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> TableFoot { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> TableFoot { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> TableFoot { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> TableFoot { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> TableFoot { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> TableFoot { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> TableFoot { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> TableFoot { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> TableFoot { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> TableFoot { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> TableFoot { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> TableFoot { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -1913,7 +2225,7 @@ public struct TableRow: ContentNode, TableElement { internal var name: String { "tr" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -1928,7 +2240,7 @@ public struct TableRow: ContentNode, TableElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -1957,280 +2269,332 @@ public struct TableRow: ContentNode, TableElement { extension TableRow: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, WidthAttribute, HeightAttribute { public func accessKey(_ value: Character) -> TableRow { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> TableRow { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> TableRow { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> TableRow { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> TableRow { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> TableRow { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> TableRow { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> TableRow { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> TableRow { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> TableRow { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> TableRow { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> TableRow { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> TableRow { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> TableRow { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> TableRow { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> TableRow { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> TableRow { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> TableRow { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> TableRow { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> TableRow { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> TableRow { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> TableRow { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> TableRow { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> TableRow { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> TableRow { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> TableRow { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> TableRow { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> TableRow { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> TableRow { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> TableRow { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> TableRow { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> TableRow { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> TableRow { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> TableRow { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> TableRow { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func width(_ size: Int) -> TableRow { - return mutate(width: size) + return mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> TableRow { - return mutate(height: size) + return mutate(height: .init(size, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> TableRow { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> TableRow { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> TableRow { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> TableRow { - return mutate(key: key, value: value) + public func custom(key: String, value: Double) -> TableRow { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> TableRow { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> TableRow { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> TableRow { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> TableRow { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> TableRow { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> TableRow { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> TableRow { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> TableRow { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> TableRow { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> TableRow { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> TableRow { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> TableRow { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> TableRow { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> TableRow { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> TableRow { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> TableRow { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> TableRow { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> TableRow { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> TableRow { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> TableRow { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> TableRow { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> TableRow { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> TableRow { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> TableRow { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> TableRow { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> TableRow { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> TableRow { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -2251,7 +2615,7 @@ public struct DataCell: ContentNode, TableElement { internal var name: String { "td" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -2266,7 +2630,7 @@ public struct DataCell: ContentNode, TableElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -2295,288 +2659,341 @@ public struct DataCell: ContentNode, TableElement { extension DataCell: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, ColumnSpanAttribute, RowSpanAttribute, HeadersAttribute { public func accessKey(_ value: Character) -> DataCell { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> DataCell { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> DataCell { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> DataCell { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> DataCell { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> DataCell { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> DataCell { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> DataCell { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> DataCell { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> DataCell { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> DataCell { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> DataCell { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> DataCell { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> DataCell { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> DataCell { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> DataCell { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> DataCell { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> DataCell { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> DataCell { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> DataCell { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> DataCell { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> DataCell { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> DataCell { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> DataCell { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> DataCell { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> DataCell { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> DataCell { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> DataCell { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> DataCell { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> DataCell { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> DataCell { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> DataCell { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> DataCell { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> DataCell { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> DataCell { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func columnSpan(_ size: Int) -> DataCell { - return mutate(colspan: size) + return mutate(colspan: .init(size, context: .trusted)) } public func rowSpan(_ size: Int) -> DataCell { - return mutate(rowspan: size) + return mutate(rowspan: .init(size, context: .trusted)) } public func headers(_ ids: [String]) -> DataCell { - return mutate(headers: ids.joined(separator: " ")) + return mutate(headers: .init(ids.joined(separator: " "), context: .tainted(.html))) } public func headers(_ ids: String...) -> DataCell { - return mutate(headers: ids.joined(separator: " ")) + return mutate(headers: .init(ids.joined(separator: " "), context: .tainted(.html))) } public func popover(_ value: Values.Popover.State) -> DataCell { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> DataCell { - return mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> DataCell { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> DataCell { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> DataCell { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> DataCell { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> DataCell { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> DataCell { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> DataCell { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> DataCell { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> DataCell { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> DataCell { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> DataCell { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> DataCell { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> DataCell { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> DataCell { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> DataCell { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> DataCell { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> DataCell { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> DataCell { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> DataCell { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> DataCell { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> DataCell { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> DataCell { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> DataCell { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> DataCell { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> DataCell { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> DataCell { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> DataCell { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> DataCell { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> DataCell { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> DataCell { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } @@ -2597,7 +3014,7 @@ public struct HeaderCell: ContentNode, TableElement { internal var name: String { "th" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -2612,7 +3029,7 @@ public struct HeaderCell: ContentNode, TableElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -2641,292 +3058,344 @@ public struct HeaderCell: ContentNode, TableElement { extension HeaderCell: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, ColumnSpanAttribute, RowSpanAttribute, HeadersAttribute, ScopeAttribute { public func accessKey(_ value: Character) -> HeaderCell { - return mutate(accesskey: value) + return mutate(accesskey: .init("\(value)", context: .trusted)) } public func autocapitalize(_ value: Values.Capitalization) -> HeaderCell { - return mutate(autocapitalize: value.rawValue) + return mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } public func autofocus() -> HeaderCell { - return mutate(autofocus: "autofocus") + return mutate(autofocus: .init("autofocus", context: .trusted)) } public func `class`(_ value: String) -> HeaderCell { - return mutate(class: value) + return mutate(class: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the editable(_:) modifier instead.") public func isEditable(_ value: Bool) -> HeaderCell { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func editable(_ value: Bool = true) -> HeaderCell { - return mutate(contenteditable: value) + return mutate(contenteditable: .init(value, context: .trusted)) } public func direction(_ value: Values.Direction) -> HeaderCell { - return mutate(dir: value.rawValue) + return mutate(dir: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the draggable(_:) modifier instead.") public func isDraggable(_ value: Bool) -> HeaderCell { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } public func draggable(_ value: Bool = true) -> HeaderCell { - return mutate(draggable: value) + return mutate(draggable: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the enterKey(_:) modifier instead.") public func enterKeyHint(_ value: Values.Hint) -> HeaderCell { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func enterKey(_ value: Values.Hint) -> HeaderCell { - return mutate(enterkeyhint: value.rawValue) + return mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } public func hidden(_ condition: Bool = true) -> HeaderCell { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } public func inputMode(_ value: Values.Mode) -> HeaderCell { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } public func `is`(_ value: String) -> HeaderCell { - return mutate(is: value) + return mutate(is: .init(value, context: .tainted(.html))) } public func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> HeaderCell { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } public func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> HeaderCell { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemId(_ value: String) -> HeaderCell { - return mutate(itemid: value) + return mutate(itemid: .init(value, context: .tainted(.html))) } public func itemProperty(_ value: String) -> HeaderCell { - return mutate(itemprop: value) + return mutate(itemprop: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemReference(_ value: String) -> HeaderCell { - return mutate(itemref: value) + return mutate(itemref: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemScope(_ value: String) -> HeaderCell { - return mutate(itemscope: value) + return mutate(itemscope: .init(value, context: .tainted(.html))) } @available(*, unavailable, message: "Use the item(id:as:for:) modifier instead.") public func itemType(_ value: String) -> HeaderCell { - return mutate(itemtype: value) + return mutate(itemtype: .init(value, context: .tainted(.html))) } public func id(_ value: String) -> HeaderCell { - return mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func language(_ value: Values.Language) -> HeaderCell { - return mutate(lang: value.rawValue) + return mutate(lang: .init(value.rawValue, context: .trusted)) } public func nonce(_ value: String) -> HeaderCell { - return mutate(nonce: value) + return mutate(nonce: .init(value, context: .tainted(.html))) } public func role(_ value: Values.Role) -> HeaderCell { - return mutate(role: value.rawValue) + return mutate(role: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the spellcheck(_:) modifier instead.") public func hasSpellCheck(_ value: Bool) -> HeaderCell { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func spellcheck(_ value: Bool = true) -> HeaderCell { - return mutate(spellcheck: value) + return mutate(spellcheck: .init(value, context: .trusted)) } public func style(_ value: String) -> HeaderCell { - return mutate(style: TaintedString(value, as: .css(.attribute))) + return mutate(style: .init(value, context: .tainted(.css))) } public func tabIndex(_ value: Int) -> HeaderCell { - return mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload public func title(_ value: String) -> HeaderCell { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } public func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> HeaderCell { - return mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } public func title(verbatim value: String) -> HeaderCell { - return mutate(title: value) + return mutate(title: .init(value, context: .tainted(.html))) } @available(*, deprecated, message: "Use the translate(_:) modifier instead.") public func translate(_ value: Values.Decision) -> HeaderCell { - return mutate(translate: value.rawValue) + return mutate(translate: .init(value.rawValue, context: .trusted)) } public func translate(_ value: Bool = true) -> HeaderCell { if value { - return mutate(translate: "yes") + return mutate(translate: .init("yes", context: .trusted)) } - return mutate(translate: "no") + return mutate(translate: .init("no", context: .trusted)) } public func inert(_ condition: Bool = true) -> HeaderCell { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self } public func columnSpan(_ size: Int) -> HeaderCell { - return mutate(colspan: size) + return mutate(colspan: .init(size, context: .trusted)) } public func rowSpan(_ size: Int) -> HeaderCell { - return mutate(rowspan: size) + return mutate(rowspan: .init(size, context: .trusted)) } public func headers(_ ids: [String]) -> HeaderCell { - return mutate(headers: ids.joined(separator: " ")) + return mutate(headers: .init(ids.joined(separator: " "), context: .tainted(.html))) } public func headers(_ ids: String...) -> HeaderCell { - return mutate(headers: ids.joined(separator: " ")) + return mutate(headers: .init(ids.joined(separator: " "), context: .tainted(.html))) } public func scope(_ value: Values.Scope) -> HeaderCell { - return mutate(scope: value.rawValue) + return mutate(scope: .init(value.rawValue, context: .trusted)) } public func popover(_ value: Values.Popover.State) -> HeaderCell { - return mutate(popover: value.rawValue) + return mutate(popover: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> HeaderCell { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> HeaderCell { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> HeaderCell { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> HeaderCell { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> HeaderCell { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> HeaderCell { - return mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> HeaderCell { + return mutate(key: key, value: .init(value, context: context)) } public func on(event: Events.Drag, _ value: String) -> HeaderCell { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Clipboard, _ value: String) -> HeaderCell { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Keyboard, _ value: String) -> HeaderCell { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Mouse, _ value: String) -> HeaderCell { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func on(event: Events.Wheel, _ value: String) -> HeaderCell { - return mutate(key: event.rawValue, value: TaintedString(value, as: .js(.attribute))) + return mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } public func aria(atomic value: Bool) -> HeaderCell { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } public func aria(busy value: Bool) -> HeaderCell { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } public func aria(controls value: String) -> HeaderCell { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } public func aria(current value: Values.Accessibility.Current) -> HeaderCell { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } public func aria(describedBy value: String) -> HeaderCell { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } public func aria(details value: String) -> HeaderCell { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } public func aria(disabled value: Bool) -> HeaderCell { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } public func aria(errorMessage value: String) -> HeaderCell { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } public func aria(flowTo value: String) -> HeaderCell { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } public func aria(hasPopup value: Values.Accessibility.Popup) -> HeaderCell { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } public func aria(hidden value: Bool) -> HeaderCell { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } public func aria(invalid value: Values.Accessibility.Invalid) -> HeaderCell { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } public func aria(keyShortcuts value: String) -> HeaderCell { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } public func aria(label value: String) -> HeaderCell { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } public func aria(labeledBy value: String) -> HeaderCell { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } public func aria(live value: Values.Accessibility.Live) -> HeaderCell { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } public func aria(owns value: String) -> HeaderCell { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } public func aria(relevant value: Values.Accessibility.Relevant) -> HeaderCell { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } public func aria(roleDescription value: String) -> HeaderCell { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } } diff --git a/Sources/HTMLKit/Abstraction/Elements/VectorElements.swift b/Sources/HTMLKit/Abstraction/Elements/VectorElements.swift index 43a7652b..d1d6e123 100644 --- a/Sources/HTMLKit/Abstraction/Elements/VectorElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/VectorElements.swift @@ -22,7 +22,7 @@ public struct Circle: ContentNode, VectorElement { internal var name: String { "circle" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -37,7 +37,7 @@ public struct Circle: ContentNode, VectorElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -66,82 +66,132 @@ public struct Circle: ContentNode, VectorElement { extension Circle: GlobalVectorAttributes, CenterPointAttribute, RadiusAttribute { public func id(_ value: String) -> Circle { - return self.mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func tabIndex(_ value: Int) -> Circle { - return self.mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } public func `class`(_ value: String) -> Circle { - return self.mutate(class: value) + return self.mutate(class: .init(value, context: .tainted(.html))) } public func style(_ value: String) -> Circle { - return self.mutate(style: TaintedString(value, as: .css(.attribute))) + return self.mutate(style: .init(value, context: .tainted(.css))) } public func fill(_ color: String, opacity: Double? = nil) -> Circle { - return self.mutate(fill: color).mutate(fillopacity: opacity) + + var copy = self + + copy = copy.mutate(fill: .init(color, context: .tainted(.html))) + + if let opacity = opacity { + copy = copy.mutate(fillopacity: .init(opacity, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func stroke(_ value: String) -> Circle { - return self.mutate(stroke: value) + return self.mutate(stroke: .init(value, context: .tainted(.html))) } public func stroke(_ color: String, width: Int? = nil, opacity: Double? = nil, cap: Values.Linecap? = nil, join: Values.Linejoin? = nil) -> Circle { - return self.mutate(stroke: color).mutate(strokewidth: width).mutate(strokeopacity: opacity).mutate(strokelinecap: cap?.rawValue).mutate(strokelinejoin: join?.rawValue) + + var copy = self + + copy = copy.mutate(stroke: .init(color, context: .tainted(.html))) + + if let width = width { + copy = copy.mutate(strokewidth: .init(width, context: .trusted)) + } + + if let opacity = opacity { + copy = copy.mutate(strokeopacity: .init(opacity, context: .trusted)) + } + + if let cap = cap { + copy = copy.mutate(strokelinecap: .init(cap.rawValue, context: .trusted)) + } + + if let join = join { + copy = copy.mutate(strokelinejoin: .init(join.rawValue, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeWidth(_ size: Int) -> Circle { - return self.mutate(strokewidth: size) + return self.mutate(strokewidth: .init(size, context: .trusted)) } @available(*, deprecated, message: "Use the center(x:y:) modifier instead.") public func centerPoint(_ point: (Int, Int)) -> Circle { - return self.mutate(cx: "\(point.0)").mutate(cy: "\(point.1)") + return self.mutate(cx: .init(point.0, context: .trusted)).mutate(cy: .init(point.1, context: .trusted)) } public func center(x: Int, y: Int) -> Circle { - return self.mutate(cx: "\(x)").mutate(cy: "\(y)") + return self.mutate(cx: .init(x, context: .trusted)).mutate(cy: .init(y, context: .trusted)) } public func center(x: Double, y: Double) -> Circle { - return self.mutate(cx: "\(x)").mutate(cy: "\(y)") + return self.mutate(cx: .init(x, context: .trusted)).mutate(cy: .init(y, context: .trusted)) } public func center(_ point: UnitPoint) -> Circle { - return self.mutate(cx: point.x).mutate(cy: point.y) + return self.mutate(cx: .init(point.x, context: .trusted)).mutate(cy: .init(point.y, context: .trusted)) } public func radius(_ size: Int) -> Circle { - return self.mutate(radius: size) + return self.mutate(radius: .init(size, context: .trusted)) } @available(*, deprecated, message: "Use the fill(_:opacity:) modifier instead.") public func fillOpacity(_ value: Double) -> Circle { - return self.mutate(fillopacity: value) + return self.mutate(fillopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeOpacity(_ value: Double) -> Circle { - return self.mutate(strokeopacity: value) + return self.mutate(strokeopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineCap(_ value: Values.Linecap) -> Circle { - return self.mutate(strokelinecap: value.rawValue) + return self.mutate(strokelinecap: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineJoin(_ value: Values.Linejoin) -> Circle { - return self.mutate(strokelinejoin: value.rawValue) + return self.mutate(strokelinejoin: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> Circle { - return self.mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Circle { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Circle { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Circle { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Circle { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Circle { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Circle { + return mutate(key: key, value: .init(value, context: context)) } } @@ -163,7 +213,7 @@ public struct Rectangle: ContentNode, VectorElement { internal var name: String { "rect" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -178,7 +228,7 @@ public struct Rectangle: ContentNode, VectorElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -207,103 +257,153 @@ public struct Rectangle: ContentNode, VectorElement { extension Rectangle: GlobalVectorAttributes, WidthAttribute, HeightAttribute, RadiusPointAttribute, PositionPointAttribute { public func id(_ value: String) -> Rectangle { - return self.mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func tabIndex(_ value: Int) -> Rectangle { - return self.mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } public func `class`(_ value: String) -> Rectangle { - return self.mutate(class: value) + return self.mutate(class: .init(value, context: .tainted(.html))) } public func style(_ value: String) -> Rectangle { - return self.mutate(style: TaintedString(value, as: .css(.attribute))) + return self.mutate(style: .init(value, context: .tainted(.css))) } public func fill(_ color: String, opacity: Double? = nil) -> Rectangle { - return self.mutate(fill: color).mutate(fillopacity: opacity) + + var copy = self + + copy = copy.mutate(fill: .init(color, context: .tainted(.html))) + + if let opacity = opacity { + copy = copy.mutate(fillopacity: .init(opacity, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func stroke(_ value: String) -> Rectangle { - return self.mutate(stroke: value) + return self.mutate(stroke: .init(value, context: .tainted(.html))) } public func stroke(_ color: String, width: Int? = nil, opacity: Double? = nil, cap: Values.Linecap? = nil, join: Values.Linejoin? = nil) -> Rectangle { - return self.mutate(stroke: color).mutate(strokewidth: width).mutate(strokeopacity: opacity).mutate(strokelinecap: cap?.rawValue).mutate(strokelinejoin: join?.rawValue) + + var copy = self + + copy = copy.mutate(stroke: .init(color, context: .tainted(.html))) + + if let width = width { + copy = copy.mutate(strokewidth: .init(width, context: .trusted)) + } + + if let opacity = opacity { + copy = copy.mutate(strokeopacity: .init(opacity, context: .trusted)) + } + + if let cap = cap { + copy = copy.mutate(strokelinecap: .init(cap.rawValue, context: .trusted)) + } + + if let join = join { + copy = copy.mutate(strokelinejoin: .init(join.rawValue, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeWidth(_ size: Int) -> Rectangle { - return self.mutate(strokewidth: size) + return self.mutate(strokewidth: .init(size, context: .trusted)) } @available(*, deprecated, message: "Use the radius(x:y:) modifier instead.") public func radiusPoint(_ point: (Int, Int)) -> Rectangle { - return self.mutate(rx: "\(point.0)").mutate(ry: "\(point.1)") + return self.mutate(rx: .init(point.0, context: .trusted)).mutate(ry: .init(point.1, context: .trusted)) } public func radius(x: Int, y: Int) -> Rectangle { - return self.mutate(rx: "\(x)").mutate(ry: "\(y)") + return self.mutate(rx: .init(x, context: .trusted)).mutate(ry: .init(y, context: .trusted)) } public func radius(x: Double, y: Double) -> Rectangle { - return self.mutate(rx: "\(x)").mutate(ry: "\(y)") + return self.mutate(rx: .init(x, context: .trusted)).mutate(ry: .init(y, context: .trusted)) } public func radius(_ point: UnitPoint) -> Rectangle { - return self.mutate(rx: point.x).mutate(ry: point.y) + return self.mutate(rx: .init(point.x, context: .trusted)).mutate(ry: .init(point.y, context: .trusted)) } @available(*, deprecated, message: "Use the position(x:y:) modifier instead.") public func positionPoint(_ point: (Int, Int)) -> Rectangle { - return self.mutate(x: "\(point.0)").mutate(y: "\(point.1)") + return self.mutate(x: .init(point.0, context: .trusted)).mutate(y: .init(point.1, context: .trusted)) } public func position(x: Int, y: Int) -> Rectangle { - return self.mutate(x: "\(x)").mutate(y: "\(y)") + return self.mutate(x: .init(x, context: .trusted)).mutate(y: .init(x, context: .trusted)) } public func position(x: Double, y: Double) -> Rectangle { - return self.mutate(x: "\(x)").mutate(y: "\(y)") + return self.mutate(x: .init(x, context: .trusted)).mutate(y: .init(x, context: .trusted)) } public func position(_ point: UnitPoint) -> Rectangle { - return self.mutate(x: point.x).mutate(y: point.y) + return self.mutate(x: .init(point.x, context: .trusted)).mutate(y: .init(point.y, context: .trusted)) } public func width(_ size: Int) -> Rectangle { - return self.mutate(width: size) + return self.mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> Rectangle { - return self.mutate(height: size) + return self.mutate(height: .init(size, context: .trusted)) } @available(*, deprecated, message: "Use the fill(_:opacity:) modifier instead.") public func fillOpacity(_ value: Double) -> Rectangle { - return self.mutate(fillopacity: value) + return self.mutate(fillopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeOpacity(_ value: Double) -> Rectangle { - return self.mutate(strokeopacity: value) + return self.mutate(strokeopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineCap(_ value: Values.Linecap) -> Rectangle { - return self.mutate(strokelinecap: value.rawValue) + return self.mutate(strokelinecap: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineJoin(_ value: Values.Linejoin) -> Rectangle { - return self.mutate(strokelinejoin: value.rawValue) + return self.mutate(strokelinejoin: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Rectangle { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Rectangle { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Rectangle { - return self.mutate(key: key, value: value) + public func custom(key: String, value: Double) -> Rectangle { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Rectangle { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Rectangle { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Rectangle { + return mutate(key: key, value: .init(value, context: context)) } } @@ -325,7 +425,7 @@ public struct Ellipse: ContentNode, VectorElement { internal var name: String { "ellipse" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -340,7 +440,7 @@ public struct Ellipse: ContentNode, VectorElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -369,95 +469,145 @@ public struct Ellipse: ContentNode, VectorElement { extension Ellipse: GlobalVectorAttributes, CenterPointAttribute, RadiusPointAttribute { public func id(_ value: String) -> Ellipse { - return self.mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func tabIndex(_ value: Int) -> Ellipse { - return self.mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } public func `class`(_ value: String) -> Ellipse { - return self.mutate(class: value) + return self.mutate(class: .init(value, context: .tainted(.html))) } public func style(_ value: String) -> Ellipse { - return self.mutate(style: TaintedString(value, as: .css(.attribute))) + return self.mutate(style: .init(value, context: .tainted(.css))) } public func fill(_ color: String, opacity: Double? = nil) -> Ellipse { - return self.mutate(fill: color).mutate(fillopacity: opacity) + + var copy = self + + copy = copy.mutate(fill: .init(color, context: .tainted(.html))) + + if let opacity = opacity { + copy = copy.mutate(fillopacity: .init(opacity, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func stroke(_ value: String) -> Ellipse { - return self.mutate(stroke: value) + return self.mutate(stroke: .init(value, context: .tainted(.html))) } public func stroke(_ color: String, width: Int? = nil, opacity: Double? = nil, cap: Values.Linecap? = nil, join: Values.Linejoin? = nil) -> Ellipse { - return self.mutate(stroke: color).mutate(strokewidth: width).mutate(strokeopacity: opacity).mutate(strokelinecap: cap?.rawValue).mutate(strokelinejoin: join?.rawValue) + + var copy = self + + copy = copy.mutate(stroke: .init(color, context: .tainted(.html))) + + if let width = width { + copy = copy.mutate(strokewidth: .init(width, context: .trusted)) + } + + if let opacity = opacity { + copy = copy.mutate(strokeopacity: .init(opacity, context: .trusted)) + } + + if let cap = cap { + copy = copy.mutate(strokelinecap: .init(cap.rawValue, context: .trusted)) + } + + if let join = join { + copy = copy.mutate(strokelinejoin: .init(join.rawValue, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeWidth(_ size: Int) -> Ellipse { - return self.mutate(strokewidth: size) + return self.mutate(strokewidth: .init(size, context: .trusted)) } @available(*, deprecated, message: "Use the center(x:y:) modifier instead.") public func centerPoint(_ point: (Int, Int)) -> Ellipse { - return self.mutate(cx: "\(point.0)").mutate(cy: "\(point.1)") + return self.mutate(cx: .init(point.0, context: .trusted)).mutate(cy: .init(point.1, context: .trusted)) } public func center(x: Int, y: Int) -> Ellipse { - return self.mutate(cx: "\(x)").mutate(cy: "\(y)") + return self.mutate(cx: .init(x, context: .trusted)).mutate(cy: .init(y, context: .trusted)) } public func center(x: Double, y: Double) -> Ellipse { - return self.mutate(cx: "\(x)").mutate(cy: "\(y)") + return self.mutate(cx: .init(x, context: .trusted)).mutate(cy: .init(y, context: .trusted)) } public func center(_ point: UnitPoint) -> Ellipse { - return self.mutate(cx: point.x).mutate(cy: point.y) + return self.mutate(cx: .init(point.x, context: .trusted)).mutate(cy: .init(point.y, context: .trusted)) } @available(*, deprecated, message: "Use the radius(x:y:) modifier instead.") public func radiusPoint(_ point: (Int, Int)) -> Ellipse { - return self.mutate(rx: "\(point.0)").mutate(ry: "\(point.1)") + return self.mutate(rx: .init(point.0, context: .trusted)).mutate(ry: .init(point.1, context: .trusted)) } public func radius(x: Int, y: Int) -> Ellipse { - return self.mutate(rx: "\(x)").mutate(ry: "\(y)") + return self.mutate(rx: .init(x, context: .trusted)).mutate(ry: .init(y, context: .trusted)) } public func radius(x: Double, y: Double) -> Ellipse { - return self.mutate(rx: "\(x)").mutate(ry: "\(y)") + return self.mutate(rx: .init(x, context: .trusted)).mutate(ry: .init(y, context: .trusted)) } public func radius(_ point: UnitPoint) -> Ellipse { - return self.mutate(rx: point.x).mutate(ry: point.y) + return self.mutate(rx: .init(point.x, context: .trusted)).mutate(ry: .init(point.y, context: .trusted)) } @available(*, deprecated, message: "Use the fill(_:opacity:) modifier instead.") public func fillOpacity(_ value: Double) -> Ellipse { - return self.mutate(fillopacity: value) + return self.mutate(fillopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeOpacity(_ value: Double) -> Ellipse { - return self.mutate(strokeopacity: value) + return self.mutate(strokeopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineCap(_ value: Values.Linecap) -> Ellipse { - return self.mutate(strokelinecap: value.rawValue) + return self.mutate(strokelinecap: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineJoin(_ value: Values.Linejoin) -> Ellipse { - return self.mutate(strokelinejoin: value.rawValue) + return self.mutate(strokelinejoin: .init(value.rawValue, context: .trusted)) } - public func custom(key: String, value: Any) -> Ellipse { - return self.mutate(key: key, value: value) + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Ellipse { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Ellipse { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Ellipse { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Ellipse { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Ellipse { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Ellipse { + return mutate(key: key, value: .init(value, context: context)) } } @@ -479,7 +629,7 @@ public struct Line: ContentNode, VectorElement { internal var name: String { "line" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -494,7 +644,7 @@ public struct Line: ContentNode, VectorElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -523,61 +673,111 @@ public struct Line: ContentNode, VectorElement { extension Line: GlobalVectorAttributes { public func id(_ value: String) -> Line { - return self.mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func tabIndex(_ value: Int) -> Line { - return self.mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } public func `class`(_ value: String) -> Line { - return self.mutate(class: value) + return self.mutate(class: .init(value, context: .tainted(.html))) } public func style(_ value: String) -> Line { - return self.mutate(style: TaintedString(value, as: .css(.attribute))) + return self.mutate(style: .init(value, context: .tainted(.css))) } public func fill(_ color: String, opacity: Double? = nil) -> Line { - return self.mutate(fill: color).mutate(fillopacity: opacity) + + var copy = self + + copy = copy.mutate(fill: .init(color, context: .tainted(.html))) + + if let opacity = opacity { + copy = copy.mutate(fillopacity: .init(opacity, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func stroke(_ value: String) -> Line { - return self.mutate(stroke: value) + return self.mutate(stroke: .init(value, context: .tainted(.html))) } public func stroke(_ color: String, width: Int? = nil, opacity: Double? = nil, cap: Values.Linecap? = nil, join: Values.Linejoin? = nil) -> Line { - return self.mutate(stroke: color).mutate(strokewidth: width).mutate(strokeopacity: opacity).mutate(strokelinecap: cap?.rawValue).mutate(strokelinejoin: join?.rawValue) + + var copy = self + + copy = copy.mutate(stroke: .init(color, context: .tainted(.html))) + + if let width = width { + copy = copy.mutate(strokewidth: .init(width, context: .trusted)) + } + + if let opacity = opacity { + copy = copy.mutate(strokeopacity: .init(opacity, context: .trusted)) + } + + if let cap = cap { + copy = copy.mutate(strokelinecap: .init(cap.rawValue, context: .trusted)) + } + + if let join = join { + copy = copy.mutate(strokelinejoin: .init(join.rawValue, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeWidth(_ size: Int) -> Line { - return self.mutate(strokewidth: size) + return self.mutate(strokewidth: .init(size, context: .trusted)) } @available(*, deprecated, message: "Use the fill(_:opacity:) modifier instead.") public func fillOpacity(_ value: Double) -> Line { - return self.mutate(fillopacity: value) + return self.mutate(fillopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeOpacity(_ value: Double) -> Line { - return self.mutate(strokeopacity: value) + return self.mutate(strokeopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineCap(_ value: Values.Linecap) -> Line { - return self.mutate(strokelinecap: value.rawValue) + return self.mutate(strokelinecap: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineJoin(_ value: Values.Linejoin) -> Line { - return self.mutate(strokelinejoin: value.rawValue) + return self.mutate(strokelinejoin: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Line { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Line { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Line { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Line { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Line { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Line { - return self.mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Line { + return mutate(key: key, value: .init(value, context: context)) } } @@ -598,7 +798,7 @@ public struct Polygon: ContentNode, VectorElement { internal var name: String { "polygon" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -613,7 +813,7 @@ public struct Polygon: ContentNode, VectorElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -642,65 +842,115 @@ public struct Polygon: ContentNode, VectorElement { extension Polygon: GlobalVectorAttributes, PointsAttribute { public func id(_ value: String) -> Polygon { - return self.mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func tabIndex(_ value: Int) -> Polygon { - return self.mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } public func `class`(_ value: String) -> Polygon { - return self.mutate(class: value) + return self.mutate(class: .init(value, context: .tainted(.html))) } public func style(_ value: String) -> Polygon { - return self.mutate(style: TaintedString(value, as: .css(.attribute))) + return self.mutate(style: .init(value, context: .tainted(.css))) } public func fill(_ color: String, opacity: Double? = nil) -> Polygon { - return self.mutate(fill: color).mutate(fillopacity: opacity) + + var copy = self + + copy = copy.mutate(fill: .init(color, context: .tainted(.html))) + + if let opacity = opacity { + copy = copy.mutate(fillopacity: .init(opacity, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func stroke(_ value: String) -> Polygon { - return self.mutate(stroke: value) + return self.mutate(stroke: .init(value, context: .tainted(.html))) } public func stroke(_ color: String, width: Int? = nil, opacity: Double? = nil, cap: Values.Linecap? = nil, join: Values.Linejoin? = nil) -> Polygon { - return self.mutate(stroke: color).mutate(strokewidth: width).mutate(strokeopacity: opacity).mutate(strokelinecap: cap?.rawValue).mutate(strokelinejoin: join?.rawValue) + + var copy = self + + copy = copy.mutate(stroke: .init(color, context: .tainted(.html))) + + if let width = width { + copy = copy.mutate(strokewidth: .init(width, context: .trusted)) + } + + if let opacity = opacity { + copy = copy.mutate(strokeopacity: .init(opacity, context: .trusted)) + } + + if let cap = cap { + copy = copy.mutate(strokelinecap: .init(cap.rawValue, context: .trusted)) + } + + if let join = join { + copy = copy.mutate(strokelinejoin: .init(join.rawValue, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeWidth(_ size: Int) -> Polygon { - return self.mutate(strokewidth: size) + return self.mutate(strokewidth: .init(size, context: .trusted)) } @available(*, deprecated, message: "Use the fill(_:opacity:) modifier instead.") public func fillOpacity(_ value: Double) -> Polygon { - return self.mutate(fillopacity: value) + return self.mutate(fillopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeOpacity(_ value: Double) -> Polygon { - return self.mutate(strokeopacity: value) + return self.mutate(strokeopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineCap(_ value: Values.Linecap) -> Polygon { - return self.mutate(strokelinecap: value.rawValue) + return self.mutate(strokelinecap: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineJoin(_ value: Values.Linejoin) -> Polygon { - return self.mutate(strokelinejoin: value.rawValue) + return self.mutate(strokelinejoin: .init(value.rawValue, context: .trusted)) } public func points(_ value: String) -> Polygon { - return self.mutate(points: value) + return self.mutate(points: .init(value, context: .tainted(.html))) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Polygon { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Polygon { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Polygon { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Polygon { - return self.mutate(key: key, value: value) + public func custom(key: String, value: Bool) -> Polygon { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Polygon { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Polygon { + return mutate(key: key, value: .init(value, context: context)) } } @@ -721,7 +971,7 @@ public struct Polyline: ContentNode, VectorElement { internal var name: String { "polyline" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -736,7 +986,7 @@ public struct Polyline: ContentNode, VectorElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -765,65 +1015,115 @@ public struct Polyline: ContentNode, VectorElement { extension Polyline: GlobalVectorAttributes, PointsAttribute { public func id(_ value: String) -> Polyline { - return self.mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func tabIndex(_ value: Int) -> Polyline { - return self.mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } public func `class`(_ value: String) -> Polyline { - return self.mutate(class: value) + return self.mutate(class: .init(value, context: .tainted(.html))) } public func style(_ value: String) -> Polyline { - return self.mutate(style: TaintedString(value, as: .css(.attribute))) + return self.mutate(style: .init(value, context: .tainted(.css))) } public func fill(_ color: String, opacity: Double? = nil) -> Polyline { - return self.mutate(fill: color).mutate(fillopacity: opacity) + + var copy = self + + copy = copy.mutate(fill: .init(color, context: .tainted(.html))) + + if let opacity = opacity { + copy = copy.mutate(fillopacity: .init(opacity, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func stroke(_ value: String) -> Polyline { - return self.mutate(stroke: value) + return self.mutate(stroke: .init(value, context: .tainted(.html))) } public func stroke(_ color: String, width: Int? = nil, opacity: Double? = nil, cap: Values.Linecap? = nil, join: Values.Linejoin? = nil) -> Polyline { - return self.mutate(stroke: color).mutate(strokewidth: width).mutate(strokeopacity: opacity).mutate(strokelinecap: cap?.rawValue).mutate(strokelinejoin: join?.rawValue) + + var copy = self + + copy = copy.mutate(stroke: .init(color, context: .tainted(.html))) + + if let width = width { + copy = copy.mutate(strokewidth: .init(width, context: .trusted)) + } + + if let opacity = opacity { + copy = copy.mutate(strokeopacity: .init(opacity, context: .trusted)) + } + + if let cap = cap { + copy = copy.mutate(strokelinecap: .init(cap.rawValue, context: .trusted)) + } + + if let join = join { + copy = copy.mutate(strokelinejoin: .init(join.rawValue, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeWidth(_ size: Int) -> Polyline { - return self.mutate(strokewidth: size) + return self.mutate(strokewidth: .init(size, context: .trusted)) } @available(*, deprecated, message: "Use the fill(_:opacity:) modifier instead.") public func fillOpacity(_ value: Double) -> Polyline { - return self.mutate(fillopacity: value) + return self.mutate(fillopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeOpacity(_ value: Double) -> Polyline { - return self.mutate(strokeopacity: value) + return self.mutate(strokeopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineCap(_ value: Values.Linecap) -> Polyline { - return self.mutate(strokelinecap: value.rawValue) + return self.mutate(strokelinecap: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineJoin(_ value: Values.Linejoin) -> Polyline { - return self.mutate(strokelinejoin: value.rawValue) + return self.mutate(strokelinejoin: .init(value.rawValue, context: .trusted)) } public func points(_ value: String) -> Polyline { - return self.mutate(points: value) + return self.mutate(points: .init(value, context: .tainted(.html))) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Polyline { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Polyline { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Polyline { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Polyline { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Polyline { - return self.mutate(key: key, value: value) + public func custom(key: String, value: Float) -> Polyline { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Polyline { + return mutate(key: key, value: .init(value, context: context)) } } @@ -844,7 +1144,7 @@ public struct Path: ContentNode, VectorElement { internal var name: String { "path" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -859,7 +1159,7 @@ public struct Path: ContentNode, VectorElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -888,65 +1188,115 @@ public struct Path: ContentNode, VectorElement { extension Path: GlobalVectorAttributes, DrawAttribute { public func id(_ value: String) -> Path { - return self.mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func tabIndex(_ value: Int) -> Path { - return self.mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } public func `class`(_ value: String) -> Path { - return self.mutate(class: value) + return self.mutate(class: .init(value, context: .tainted(.html))) } public func style(_ value: String) -> Path { - return self.mutate(style: TaintedString(value, as: .css(.attribute))) + return self.mutate(style: .init(value, context: .tainted(.css))) } public func fill(_ color: String, opacity: Double? = nil) -> Path { - return self.mutate(fill: color).mutate(fillopacity: opacity) + + var copy = self + + copy = copy.mutate(fill: .init(color, context: .tainted(.html))) + + if let opacity = opacity { + copy = copy.mutate(fillopacity: .init(opacity, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func stroke(_ value: String) -> Path { - return self.mutate(stroke: value) + return self.mutate(stroke: .init(value, context: .tainted(.html))) } public func stroke(_ color: String, width: Int? = nil, opacity: Double? = nil, cap: Values.Linecap? = nil, join: Values.Linejoin? = nil) -> Path { - return self.mutate(stroke: color).mutate(strokewidth: width).mutate(strokeopacity: opacity).mutate(strokelinecap: cap?.rawValue).mutate(strokelinejoin: join?.rawValue) + + var copy = self + + copy = copy.mutate(stroke: .init(color, context: .tainted(.html))) + + if let width = width { + copy = copy.mutate(strokewidth: .init(width, context: .trusted)) + } + + if let opacity = opacity { + copy = copy.mutate(strokeopacity: .init(opacity, context: .trusted)) + } + + if let cap = cap { + copy = copy.mutate(strokelinecap: .init(cap.rawValue, context: .trusted)) + } + + if let join = join { + copy = copy.mutate(strokelinejoin: .init(join.rawValue, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeWidth(_ size: Int) -> Path { - return self.mutate(strokewidth: size) + return self.mutate(strokewidth: .init(size, context: .trusted)) } @available(*, deprecated, message: "Use the fill(_:opacity:) modifier instead.") public func fillOpacity(_ value: Double) -> Path { - return self.mutate(fillopacity: value) + return self.mutate(fillopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeOpacity(_ value: Double) -> Path { - return self.mutate(strokeopacity: value) + return self.mutate(strokeopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineCap(_ value: Values.Linecap) -> Path { - return self.mutate(strokelinecap: value.rawValue) + return self.mutate(strokelinecap: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineJoin(_ value: Values.Linejoin) -> Path { - return self.mutate(strokelinejoin: value.rawValue) + return self.mutate(strokelinejoin: .init(value.rawValue, context: .trusted)) } public func draw(_ value: String) -> Path { - return self.mutate(draw: value) + return self.mutate(draw: .init(value, context: .tainted(.html))) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Path { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Path { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Path { - return self.mutate(key: key, value: value) + public func custom(key: String, value: Double) -> Path { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Path { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Path { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Path { + return mutate(key: key, value: .init(value, context: context)) } } @@ -966,7 +1316,7 @@ public struct Group: ContentNode, VectorElement { internal var name: String { "g" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -981,7 +1331,7 @@ public struct Group: ContentNode, VectorElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -1010,61 +1360,111 @@ public struct Group: ContentNode, VectorElement { extension Group: GlobalVectorAttributes { public func id(_ value: String) -> Group { - return self.mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func tabIndex(_ value: Int) -> Group { - return self.mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } public func `class`(_ value: String) -> Group { - return self.mutate(class: value) + return self.mutate(class: .init(value, context: .tainted(.html))) } public func style(_ value: String) -> Group { - return self.mutate(style: TaintedString(value, as: .css(.attribute))) + return self.mutate(style: .init(value, context: .tainted(.css))) } public func fill(_ color: String, opacity: Double? = nil) -> Group { - return self.mutate(fill: color).mutate(fillopacity: opacity) + + var copy = self + + copy = copy.mutate(fill: .init(color, context: .tainted(.html))) + + if let opacity = opacity { + copy = copy.mutate(fillopacity: .init(opacity, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func stroke(_ value: String) -> Group { - return self.mutate(stroke: value) + return self.mutate(stroke: .init(value, context: .tainted(.html))) } public func stroke(_ color: String, width: Int? = nil, opacity: Double? = nil, cap: Values.Linecap? = nil, join: Values.Linejoin? = nil) -> Group { - return self.mutate(stroke: color).mutate(strokewidth: width).mutate(strokeopacity: opacity).mutate(strokelinecap: cap?.rawValue).mutate(strokelinejoin: join?.rawValue) + + var copy = self + + copy = copy.mutate(stroke: .init(color, context: .tainted(.html))) + + if let width = width { + copy = copy.mutate(strokewidth: .init(width, context: .trusted)) + } + + if let opacity = opacity { + copy = copy.mutate(strokeopacity: .init(opacity, context: .trusted)) + } + + if let cap = cap { + copy = copy.mutate(strokelinecap: .init(cap.rawValue, context: .trusted)) + } + + if let join = join { + copy = copy.mutate(strokelinejoin: .init(join.rawValue, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeWidth(_ size: Int) -> Group { - return self.mutate(strokewidth: size) + return self.mutate(strokewidth: .init(size, context: .trusted)) } @available(*, deprecated, message: "Use the fill(_:opacity:) modifier instead.") public func fillOpacity(_ value: Double) -> Group { - return self.mutate(fillopacity: value) + return self.mutate(fillopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeOpacity(_ value: Double) -> Group { - return self.mutate(strokeopacity: value) + return self.mutate(strokeopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineCap(_ value: Values.Linecap) -> Group { - return self.mutate(strokelinecap: value.rawValue) + return self.mutate(strokelinecap: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineJoin(_ value: Values.Linejoin) -> Group { - return self.mutate(strokelinejoin: value.rawValue) + return self.mutate(strokelinejoin: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Group { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Group { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Group { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Group { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Group { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Group { - return self.mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Group { + return mutate(key: key, value: .init(value, context: context)) } } @@ -1088,7 +1488,7 @@ public struct Use: ContentNode, VectorElement { internal var name: String { "use" } - internal var attributes: OrderedDictionary? + internal var attributes: OrderedDictionary? internal var content: [Content] @@ -1103,7 +1503,7 @@ public struct Use: ContentNode, VectorElement { self.content = content() } - internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + internal init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -1132,89 +1532,139 @@ public struct Use: ContentNode, VectorElement { extension Use: GlobalVectorAttributes, ReferenceAttribute, WidthAttribute, HeightAttribute, PositionPointAttribute { public func id(_ value: String) -> Use { - return self.mutate(id: value) + return mutate(id: .init(value, context: .tainted(.html))) } public func tabIndex(_ value: Int) -> Use { - return self.mutate(tabindex: value) + return mutate(tabindex: .init(value, context: .trusted)) } public func reference(_ value: String) -> Use { - return self.mutate(href: value) + return self.mutate(href: .init(value, context: .tainted(.url))) } @available(*, deprecated, message: "Use the position(x:y:) modifier instead.") public func positionPoint(_ point: (Int, Int)) -> Use { - return self.mutate(x: "\(point.0)").mutate(y: "\(point.1)") + return self.mutate(x: .init(point.0, context: .trusted)).mutate(y: .init(point.1, context: .trusted)) } public func position(x: Int, y: Int) -> Use { - return self.mutate(x: "\(x)").mutate(y: "\(y)") + return self.mutate(x: .init(x, context: .trusted)).mutate(y: .init(x, context: .trusted)) } public func position(x: Double, y: Double) -> Use { - return self.mutate(x: "\(x)").mutate(y: "\(y)") + return self.mutate(x: .init(x, context: .trusted)).mutate(y: .init(x, context: .trusted)) } public func position(_ point: UnitPoint) -> Use { - return self.mutate(x: point.x).mutate(y: point.y) + return self.mutate(x: .init(point.x, context: .trusted)).mutate(y: .init(point.y, context: .trusted)) } public func width(_ size: Int) -> Use { - return self.mutate(width: size) + return self.mutate(width: .init(size, context: .trusted)) } public func height(_ size: Int) -> Use { - return self.mutate(height: size) + return self.mutate(height: .init(size, context: .trusted)) } public func `class`(_ value: String) -> Use { - return self.mutate(class: value) + return self.mutate(class: .init(value, context: .tainted(.html))) } public func style(_ value: String) -> Use { - return self.mutate(style: TaintedString(value, as: .css(.attribute))) + return self.mutate(style: .init(value, context: .tainted(.css))) } public func fill(_ color: String, opacity: Double? = nil) -> Use { - return self.mutate(fill: color).mutate(fillopacity: opacity) + + var copy = self + + copy = copy.mutate(fill: .init(color, context: .tainted(.html))) + + if let opacity = opacity { + copy = copy.mutate(fillopacity: .init(opacity, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func stroke(_ value: String) -> Use { - return self.mutate(stroke: value) + return self.mutate(stroke: .init(value, context: .tainted(.html))) } public func stroke(_ color: String, width: Int? = nil, opacity: Double? = nil, cap: Values.Linecap? = nil, join: Values.Linejoin? = nil) -> Use { - return self.mutate(stroke: color).mutate(strokewidth: width).mutate(strokeopacity: opacity).mutate(strokelinecap: cap?.rawValue).mutate(strokelinejoin: join?.rawValue) + + var copy = self + + copy = copy.mutate(stroke: .init(color, context: .tainted(.html))) + + if let width = width { + copy = copy.mutate(strokewidth: .init(width, context: .trusted)) + } + + if let opacity = opacity { + copy = copy.mutate(strokeopacity: .init(opacity, context: .trusted)) + } + + if let cap = cap { + copy = copy.mutate(strokelinecap: .init(cap.rawValue, context: .trusted)) + } + + if let join = join { + copy = copy.mutate(strokelinejoin: .init(join.rawValue, context: .trusted)) + } + + return copy } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeWidth(_ size: Int) -> Use { - return self.mutate(strokewidth: size) + return self.mutate(strokewidth: .init(size, context: .trusted)) } @available(*, deprecated, message: "Use the fill(_:opacity:) modifier instead.") public func fillOpacity(_ value: Double) -> Use { - return self.mutate(fillopacity: value) + return self.mutate(fillopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeOpacity(_ value: Double) -> Use { - return self.mutate(strokeopacity: value) + return self.mutate(strokeopacity: .init(value, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineCap(_ value: Values.Linecap) -> Use { - return self.mutate(strokelinecap: value.rawValue) + return self.mutate(strokelinecap: .init(value.rawValue, context: .trusted)) } @available(*, deprecated, message: "Use the stroke(_:width:opacity:cap:join:) modifier instead.") public func strokeLineJoin(_ value: Values.Linejoin) -> Use { - return self.mutate(strokelinejoin: value.rawValue) + return self.mutate(strokelinejoin: .init(value.rawValue, context: .trusted)) + } + + public func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Use { + return mutate(key: key, value: .init(value, context: context)) + } + + public func custom(key: String, value: Int) -> Use { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Double) -> Use { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Bool) -> Use { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + public func custom(key: String, value: Float) -> Use { + return mutate(key: key, value: .init(value, context: .trusted)) } - public func custom(key: String, value: Any) -> Use { - return self.mutate(key: key, value: value) + public func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Use { + return mutate(key: key, value: .init(value, context: context)) } } diff --git a/Sources/HTMLKit/Framework/Primitives/Attributes/Attribute.swift b/Sources/HTMLKit/Framework/Primitives/Attributes/Attribute.swift index 83dc821c..5cf10986 100644 --- a/Sources/HTMLKit/Framework/Primitives/Attributes/Attribute.swift +++ b/Sources/HTMLKit/Framework/Primitives/Attributes/Attribute.swift @@ -11,13 +11,22 @@ import OrderedCollections @_documentation(visibility: internal) public protocol Attribute { - /// The func adds - func custom(key: String, value: Any) -> Self + func custom(key: String, value: String, context: EscapeContext) -> Self + + func custom(key: String, value: Int) -> Self + + func custom(key: String, value: Double) -> Self + + func custom(key: String, value: Bool) -> Self + + func custom(key: String, value: Float) -> Self + + func custom(key: String, value: EnvironmentValue, context: EscapeContext) -> Self } extension Attribute where Self: ContentNode { - internal func mutate(key: String, value: Any) -> Self { + internal func mutate(key: String, value: AttributeData) -> Self { guard var attributes = self.attributes else { return .init(attributes: [key: value], context: context, content: content) @@ -31,7 +40,7 @@ extension Attribute where Self: ContentNode { extension Attribute where Self: EmptyNode { - internal func mutate(key: String, value: Any) -> Self { + internal func mutate(key: String, value: AttributeData) -> Self { guard var attributes = self.attributes else { return .init(attributes: [key: value]) @@ -45,7 +54,7 @@ extension Attribute where Self: EmptyNode { extension Attribute where Self: CustomNode { - internal func mutate(key: String, value: Any) -> Self { + internal func mutate(key: String, value: AttributeData) -> Self { guard var attributes = self.attributes else { return .init(name: name, attributes: [key: value], context: context, content: content) diff --git a/Sources/HTMLKit/Framework/Primitives/Attributes/AttributeData.swift b/Sources/HTMLKit/Framework/Primitives/Attributes/AttributeData.swift new file mode 100644 index 00000000..c2b96180 --- /dev/null +++ b/Sources/HTMLKit/Framework/Primitives/Attributes/AttributeData.swift @@ -0,0 +1,111 @@ +/// A type that holds the data. +public struct AttributeData { + + /// A type that holds the data. + internal enum DataValue { + + /// A string value + case string(String) + + /// A int value + case int(Int) + + /// A double value + case double(Double) + + /// A booleanl value + case bool(Bool) + + /// A float value + case float(Float) + + /// A localized string + case localized(LocalizedString) + + /// A environment value + case environment(EnvironmentValue) + } + + /// The + internal var context: EscapeContext + + /// The actual data value. + internal var value: DataValue + + /// Create a string attribute. + /// + /// - Parameters: + /// - value: The string value + /// - context: Whether the value is safe + public init(_ value: String, context: EscapeContext) { + + self.context = context + self.value = .string(value) + } + + /// Create a int attribute. + /// + /// - Parameters: + /// - value: The int value + /// - context: Whether the value is safe + public init(_ value: Int, context: EscapeContext) { + + self.context = context + self.value = .int(value) + } + + /// Create a double attribute. + /// + /// - Parameters: + /// - value: The double value + /// - context: Whether the value is safe + public init(_ value: Double, context: EscapeContext) { + + self.context = context + self.value = .double(value) + } + + /// Create a bool attribute. + /// + /// - Parameters: + /// - value: The string value + /// - context: Whether the value is safe + public init(_ value: Bool, context: EscapeContext) { + + self.context = context + self.value = .bool(value) + } + + /// Create a float attribute. + /// + /// - Parameters: + /// - value: The float value + /// - context: Whether the value is safe + public init(_ value: Float, context: EscapeContext) { + + self.context = context + self.value = .float(value) + } + + /// Create a localiized attribute. + /// + /// - Parameters: + /// - value: The string value + /// - context: Whether the value is safe + public init(_ value: LocalizedString, context: EscapeContext) { + + self.context = context + self.value = .localized(value) + } + + /// Create a environment attribute. + /// + /// - Parameters: + /// - value: The string value + /// - context: Whether the value is safe + public init(_ value: EnvironmentValue, context: EscapeContext) { + + self.context = context + self.value = .environment(value) + } +} diff --git a/Sources/HTMLKit/Framework/Primitives/Nodes/Nodes.swift b/Sources/HTMLKit/Framework/Primitives/Nodes/Nodes.swift index 84a7e832..352dcc3c 100644 --- a/Sources/HTMLKit/Framework/Primitives/Nodes/Nodes.swift +++ b/Sources/HTMLKit/Framework/Primitives/Nodes/Nodes.swift @@ -15,7 +15,7 @@ internal protocol ContentNode: Node { var name: String { get } /// The attributes of the node. - var attributes: OrderedDictionary? { get } + var attributes: OrderedDictionary? { get } /// The content of the node. var content: [Content] { get } @@ -28,7 +28,7 @@ internal protocol ContentNode: Node { /// - Parameters: /// - attributes: /// - content: - init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) + init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) } extension ContentNode { @@ -53,13 +53,13 @@ internal protocol EmptyNode: Node { var name: String { get } /// The attributes of the node. - var attributes: OrderedDictionary? { get } + var attributes: OrderedDictionary? { get } /// Initiates a node. /// /// - Parameters: /// - attributes: - init(attributes: OrderedDictionary?) + init(attributes: OrderedDictionary?) } extension EmptyNode { @@ -107,7 +107,7 @@ public protocol CustomNode: Node { var name: String { get set } /// The attributes of the node. - var attributes: OrderedDictionary? { get } + var attributes: OrderedDictionary? { get } /// The content of the node. var content: [Content] { get } @@ -120,7 +120,7 @@ public protocol CustomNode: Node { /// - Parameters: /// - attributes: /// - content: - init(name: String, attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) + init(name: String, attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) } extension CustomNode { diff --git a/Sources/HTMLKit/Framework/Rendering/Renderer.swift b/Sources/HTMLKit/Framework/Rendering/Renderer.swift index c3aee38e..54b8a8be 100644 --- a/Sources/HTMLKit/Framework/Rendering/Renderer.swift +++ b/Sources/HTMLKit/Framework/Rendering/Renderer.swift @@ -458,27 +458,76 @@ public struct Renderer { /// - Parameter attributes: The attributes to render /// /// - Returns: The string representation - private func render(attributes: OrderedDictionary, on result: inout String) throws { + private func render(attributes: OrderedDictionary, on result: inout String) throws { for attribute in attributes { result += " \(attribute.key)=\"" - switch attribute.value { - case let string as LocalizedString: - result += try render(localized: string) - - case let value as EnvironmentValue: - result += try render(envattribute: value) + switch attribute.value.context { + case .trusted: - case let string as TaintedString: - result += escape(tainted: string) + switch attribute.value.value { + case .string(let string): + + result += string + + case .bool(let bool): + + result += "\(bool)" + + case .double(let double): + + result += "\(double)" + + case .float(let float): + + result += "\(float)" + + case .int(let int): + + result += "\(int)" + + case .localized(let localized): + + result += try render(localized: localized) + + case .environment(let environment): + + result += try render(envattribute: environment) + } - case let string as String: - result += escape(tainted: .init(string, as: .html(.attribute))) + case .tainted(let subcontext): - default: - result += "\(attribute.value)" + switch attribute.value.value { + case .string(let string): + + result += escape(attribute: string, with: subcontext) + + case .bool(let bool): + + result += "\(bool)" + + case .double(let double): + + result += "\(double)" + + case .float(let float): + + result += "\(float)" + + case .int(let int): + + result += "\(int)" + + case .localized(let localized): + + result += try render(localized: localized) + + case .environment(let environment): + + result += try render(envattribute: environment) + } } result += "\"" @@ -809,13 +858,38 @@ public struct Renderer { return encoder.encode(string, as: .html(.element)) case .css: - return encoder.encode(string, as: .css(.element)) + + // To prevent breaking out of context + let sanitized = sanitizer.strip("style", from: string) + + return encoder.encode(sanitized, as: .css(.element)) case .js: - return encoder.encode(string, as: .js(.element)) + + // To prevent breaking out of context + let sanitized = sanitizer.strip("script", from: string) + + return encoder.encode(sanitized, as: .js(.element)) case .url: return encoder.encode(string, as: .html(.element)) } } + + private func escape(attribute string: String, with context: EscapeContext.Subcontext) -> String { + + switch context { + case .html: + return encoder.encode(string, as: .html(.attribute)) + + case .css: + return encoder.encode(string, as: .css(.attribute)) + + case .js: + return encoder.encode(string, as: .js(.attribute)) + + case .url: + return encoder.encode(string, as: .html(.attribute)) + } + } } diff --git a/Sources/HTMLKitComponents/Components/Symbol.swift b/Sources/HTMLKitComponents/Components/Symbol.swift index 75596d05..6b6591de 100644 --- a/Sources/HTMLKitComponents/Components/Symbol.swift +++ b/Sources/HTMLKitComponents/Components/Symbol.swift @@ -309,7 +309,7 @@ extension Symbol { fileprivate static func parse(node: XMLNode) throws -> VectorElement? { - var tempAttributes: OrderedDictionary = [:] + var tempAttributes: OrderedDictionary = [:] var tempContent: [Content] = [] guard let element = node as? XMLElement else { @@ -325,7 +325,10 @@ extension Symbol { for attribute in attributes { if let attributeName = attribute.localName { - tempAttributes[attributeName] = attribute.stringValue + + if let stringValue = attribute.stringValue { + tempAttributes[attributeName] = AttributeData(stringValue, context: .trusted) + } } } } diff --git a/Tests/HTMLKitTests/AttributesTests.swift b/Tests/HTMLKitTests/AttributesTests.swift index 82c787fe..0fa37984 100644 --- a/Tests/HTMLKitTests/AttributesTests.swift +++ b/Tests/HTMLKitTests/AttributesTests.swift @@ -15,13 +15,13 @@ final class AttributesTests: XCTestCase { @ContentBuilder var body: Content } - typealias AllAttributes = AccessKeyAttribute & AcceptAttribute & ActionAttribute & AlternateAttribute & AsynchronouslyAttribute & AutocapitalizeAttribute & AutocompleteAttribute & AutofocusAttribute & AutoplayAttribute & CharsetAttribute & CheckedAttribute & CiteAttribute & ClassAttribute & ColumnsAttribute & ColumnSpanAttribute & ContentAttribute & EditAttribute & ControlsAttribute & CoordinatesAttribute & DataAttribute & DateTimeAttribute & DefaultAttribute & DeferAttribute & DirectionAttribute & DisabledAttribute & DownloadAttribute & DragAttribute & EncodingAttribute & EnterKeyAttribute & ForAttribute & FormAttribute & FormActionAttribute & EquivalentAttribute & HeadersAttribute & HeightAttribute & HiddenAttribute & HighAttribute & ReferenceAttribute & ReferenceLanguageAttribute & IdentifierAttribute & IsMapAttribute & InputModeAttribute & IsAttribute & ItemAttribute & ItemPropertyAttribute & KindAttribute & LabelAttribute & LanguageAttribute & ListAttribute & LoopAttribute & LowAttribute & MaximumValueAttribute & MaximumLengthAttribute & MediaAttribute & MethodAttribute & MinimumValueAttribute & MinimumLengthAttribute & MultipleAttribute & MutedAttribute & NameAttribute & NonceAttribute & NoValidateAttribute & OpenAttribute & OptimumAttribute & PatternAttribute & PartAttribute & PingAttribute & PlaceholderAttribute & PosterAttribute & PreloadAttribute & ReadOnlyAttribute & ReferrerPolicyAttribute & RelationshipAttribute & RequiredAttribute & ReversedAttribute & RoleAttribute & RowsAttribute & RowSpanAttribute & SandboxAttribute & ScopeAttribute & ShapeAttribute & SizeAttribute & SizesAttribute & SlotAttribute & SpanAttribute & SpellCheckAttribute & SourceAttribute & StartAttribute & StepAttribute & StyleAttribute & TabulatorAttribute & TargetAttribute & TitleAttribute & TranslateAttribute & TypeAttribute & ValueAttribute & WidthAttribute & WrapAttribute & PropertyAttribute & SelectedAttribute & WindowEventAttribute & FocusEventAttribute & PointerEventAttribute & MouseEventAttribute & WheelEventAttribute & InputEventAttribute & KeyboardEventAttribute & DragEventAttribute & ClipboardEventAttribute & SelectionEventAttribute & MediaEventAttribute & FormEventAttribute & DetailEventAttribute & AriaAtomicAttribute & AriaBusyAttribute & AriaControlsAttribute & AriaCurrentAttribute & AriaDescribedAttribute & AriaDetailsAttribute & AriaDisabledAttribute & AriaErrorMessageAttribute & AriaFlowToAttribute & AriaPopupAttribute & AriaHiddenAttribute & AriaInvalidAttribute & AriaShortcutsAttribute & AriaLabelAttribute & AriaLabeledAttribute & AriaLiveAttribute & AriaOwnsAttribute & AriaRelevantAttribute & AriaRoleDescriptionAttribute & DrawAttribute & FillAttribute & StrokeAttribute & StrokeWidthAttribute & StrokeOpacityAttribute & StrokeLineCapAttribute & StrokeLineJoinAttribute & RadiusAttribute & PositionPointAttribute & RadiusPointAttribute & CenterPointAttribute & ViewBoxAttribute & NamespaceAttribute & PointsAttribute & ShadowRootModeAttribute & InertAttribute & FetchPriorityAttribute & LoadingAttribute & SourceSetAttribute & DecodingAttribute & BlockingAttribute & PopoverAttribute & PopoverTargetAttribute & PopoverActionAttribute & UseMapAttribute & PlaysInlineAttribute & IntegrityAttribute & AsAttribute & CrossOriginAttribute & SourceLanguageAttribute & SourceDocumentAttribute + typealias AllAttributes = AccessKeyAttribute & AcceptAttribute & ActionAttribute & AlternateAttribute & AsynchronouslyAttribute & AutocapitalizeAttribute & AutocompleteAttribute & AutofocusAttribute & AutoplayAttribute & CharsetAttribute & CheckedAttribute & CiteAttribute & ClassAttribute & ColumnsAttribute & ColumnSpanAttribute & ContentAttribute & EditAttribute & ControlsAttribute & CoordinatesAttribute & DataAttribute & DateTimeAttribute & DefaultAttribute & DeferAttribute & DirectionAttribute & DisabledAttribute & DownloadAttribute & DragAttribute & EncodingAttribute & EnterKeyAttribute & ForAttribute & FormAttribute & FormActionAttribute & EquivalentAttribute & HeadersAttribute & HeightAttribute & HiddenAttribute & HighAttribute & ReferenceAttribute & ReferenceLanguageAttribute & IdentifierAttribute & IsMapAttribute & InputModeAttribute & IsAttribute & ItemAttribute & ItemPropertyAttribute & KindAttribute & LabelAttribute & LanguageAttribute & ListAttribute & LoopAttribute & LowAttribute & MaximumValueAttribute & MaximumLengthAttribute & MediaAttribute & MethodAttribute & MinimumValueAttribute & MinimumLengthAttribute & MultipleAttribute & MutedAttribute & NameAttribute & NonceAttribute & NoValidateAttribute & OpenAttribute & OptimumAttribute & PatternAttribute & PartAttribute & PingAttribute & PlaceholderAttribute & PosterAttribute & PreloadAttribute & ReadOnlyAttribute & ReferrerPolicyAttribute & RelationshipAttribute & RequiredAttribute & ReversedAttribute & RoleAttribute & RowsAttribute & RowSpanAttribute & SandboxAttribute & ScopeAttribute & ShapeAttribute & SizeAttribute & SizesAttribute & SlotAttribute & SpanAttribute & SpellCheckAttribute & SourceAttribute & StartAttribute & StepAttribute & StyleAttribute & TabulatorAttribute & TargetAttribute & TitleAttribute & TranslateAttribute & TypeAttribute & ValueAttribute & WidthAttribute & WrapAttribute & PropertyAttribute & SelectedAttribute & WindowEventAttribute & FocusEventAttribute & PointerEventAttribute & MouseEventAttribute & WheelEventAttribute & InputEventAttribute & KeyboardEventAttribute & DragEventAttribute & ClipboardEventAttribute & SelectionEventAttribute & MediaEventAttribute & FormEventAttribute & DetailEventAttribute & AriaAtomicAttribute & AriaBusyAttribute & AriaControlsAttribute & AriaCurrentAttribute & AriaDescribedAttribute & AriaDetailsAttribute & AriaDisabledAttribute & AriaErrorMessageAttribute & AriaFlowToAttribute & AriaPopupAttribute & AriaHiddenAttribute & AriaInvalidAttribute & AriaShortcutsAttribute & AriaLabelAttribute & AriaLabeledAttribute & AriaLiveAttribute & AriaOwnsAttribute & AriaRelevantAttribute & AriaRoleDescriptionAttribute & DrawAttribute & FillAttribute & FillOpacityAttribute & StrokeAttribute & StrokeWidthAttribute & StrokeOpacityAttribute & StrokeLineCapAttribute & StrokeLineJoinAttribute & RadiusAttribute & PositionPointAttribute & RadiusPointAttribute & CenterPointAttribute & ViewBoxAttribute & NamespaceAttribute & PointsAttribute & ShadowRootModeAttribute & InertAttribute & FetchPriorityAttribute & LoadingAttribute & SourceSetAttribute & DecodingAttribute & BlockingAttribute & PopoverAttribute & PopoverTargetAttribute & PopoverActionAttribute & UseMapAttribute & PlaysInlineAttribute & IntegrityAttribute & AsAttribute & CrossOriginAttribute & SourceLanguageAttribute & SourceDocumentAttribute struct Tag: ContentNode, GlobalElement, AllAttributes { var name: String { "tag" } - var attributes: OrderedDictionary? + var attributes: OrderedDictionary? var content: [Content] @@ -33,7 +33,7 @@ final class AttributesTests: XCTestCase { self.content = content() } - init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { + init(attributes: OrderedDictionary?, context: EscapeContext, content: [Content]) { self.attributes = attributes self.context = context @@ -41,873 +41,968 @@ final class AttributesTests: XCTestCase { } func accessKey(_ value: Character) -> Tag { - return self.mutate(accesskey: value) + return self.mutate(accesskey: .init("\(value)", context: .trusted)) } func `as`(_ value: HTMLKit.Values.Resource) -> Tag { - return self.mutate(as: value.rawValue) + return self.mutate(as: .init(value.rawValue, context: .trusted)) } func autocapitalize(_ value: Values.Capitalization) -> Tag { - return self.mutate(autocapitalize: value.rawValue) + return self.mutate(autocapitalize: .init(value.rawValue, context: .trusted)) } func autofocus() -> Tag { - return self.mutate(autofocus: "autofocus") + return self.mutate(autofocus: .init("autofocus", context: .trusted)) } func `class`(_ value: String) -> Tag { - return self.mutate(class: value) + return self.mutate(class: .init(value, context: .tainted(.html))) } func direction(_ value: Values.Direction) -> Tag { - return self.mutate(dir: value.rawValue) + return self.mutate(dir: .init(value.rawValue, context: .trusted)) } func draggable(_ value: Bool = true) -> Tag { - return self.mutate(draggable: value) + return self.mutate(draggable: .init(value, context: .trusted)) } func editable(_ value: Bool = true) -> Tag { - return self.mutate(contenteditable: value) + return self.mutate(contenteditable: .init(value, context: .trusted)) } func enterKey(_ value: Values.Hint) -> Tag { - return self.mutate(enterkeyhint: value.rawValue) + return self.mutate(enterkeyhint: .init(value.rawValue, context: .trusted)) } func hidden(_ condition: Bool = true) -> Tag { if condition { - return mutate(hidden: "hidden") + return mutate(hidden: .init("hidden", context: .trusted)) } return self } func id(_ value: String) -> Tag { - return self.mutate(id: value) + return self.mutate(id: .init(value, context: .tainted(.html))) } func inputMode(_ value: Values.Mode) -> Tag { - return mutate(inputmode: value.rawValue) + return mutate(inputmode: .init(value.rawValue, context: .trusted)) } func `is`(_ value: String) -> Tag { - return self.mutate(is: value) + return self.mutate(is: .init(value, context: .tainted(.html))) } func item(id: String? = nil, as schema: URL? = nil, for elements: [String]? = nil) -> Tag { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements?.joined(separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + if let elements = elements { + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + } + + return copy } func item(id: String? = nil, as schema: URL? = nil, for elements: String...) -> Tag { - return self.mutate(itemscope: "itemscope").mutate(itemid: id).mutate(itemtype: schema?.absoluteString).mutate(itemref: elements.joined( separator: " ")) + + var copy = self + + copy = copy.mutate(itemscope: .init("itemscope", context: .trusted)) + + if let id = id { + copy = copy.mutate(itemid: .init(id, context: .tainted(.html))) + } + + if let schema = schema { + copy = copy.mutate(itemtype: .init(schema.absoluteString, context: .tainted(.html))) + } + + copy = copy.mutate(itemref: .init(elements.joined(separator: " "), context: .tainted(.html))) + + return copy } func itemProperty(_ value: String) -> Tag { - return self.mutate(itemprop: value) + return self.mutate(itemprop: .init(value, context: .tainted(.html))) } func language(_ value: Values.Language) -> Tag { - return self.mutate(lang: value.rawValue) + return self.mutate(lang: .init(value.rawValue, context: .trusted)) } func nonce(_ value: String) -> Tag { - return self.mutate(nonce: value) + return self.mutate(nonce: .init(value, context: .tainted(.html))) } func role(_ value: Values.Role) -> Tag { - return self.mutate(role: value.rawValue) + return self.mutate(role: .init(value.rawValue, context: .trusted)) } func spellcheck(_ value: Bool = true) -> Tag { - return self.mutate(spellcheck: value) + return self.mutate(spellcheck: .init(value, context: .trusted)) } func style(_ value: String) -> Tag { - return self.mutate(style: TaintedString(value, as: .css(.attribute))) + return self.mutate(style: .init(value, context: .tainted(.css))) } func tabIndex(_ value: Int) -> Tag { - return self.mutate(tabindex: value) + return self.mutate(tabindex: .init(value, context: .trusted)) } @_disfavoredOverload func title(_ value: String) -> Tag { - return self.mutate(title: value) + return self.mutate(title: .init(value, context: .tainted(.html))) } func title(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Tag { - return self.mutate(title: LocalizedString(key: localizedKey, table: tableName)) + return self.mutate(title: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } func title(verbatim value: String) -> Tag { - return self.mutate(title: value) + return self.mutate(title: .init(value, context: .tainted(.html))) } func translate(_ value: Bool = true) -> Tag { if value { - return self.mutate(translate: "yes") + return self.mutate(translate: .init("yes", context: .trusted)) } - return self.mutate(translate: "no") + return self.mutate(translate: .init("no", context: .trusted)) } func accept(_ specifiers: [String]) -> Tag { - return self.mutate(accept: specifiers.joined(separator: ", ")) + return self.mutate(accept: .init(specifiers.joined(separator: ", "), context: .tainted(.html))) } func accept(_ specifiers: String...) -> Tag { - return self.mutate(accept: specifiers.joined(separator: ", ")) + return self.mutate(accept: .init(specifiers.joined(separator: ", "), context: .tainted(.html))) } func accept(_ specifiers: [Values.Media]) -> Tag { - return self.mutate(accept: specifiers.map { $0.rawValue }.joined(separator: ", ")) + return self.mutate(accept: .init(specifiers.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } func accept(_ specifiers: Values.Media...) -> Tag { - return self.mutate(accept: specifiers.map { $0.rawValue }.joined(separator: ", ")) + return self.mutate(accept: .init(specifiers.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } func action(_ value: String) -> Tag { - return self.mutate(action: value) + return self.mutate(action: .init(value, context: .tainted(.html))) } @_disfavoredOverload func alternate(_ value: String) -> Tag { - return self.mutate(alternate: value) + return self.mutate(alternate: .init(value, context: .tainted(.html))) } func alternate(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Tag { - return mutate(alternate: LocalizedString(key: localizedKey, table: tableName)) + return mutate(alternate: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } func alternate(verbatim value: String) -> Tag { - return self.mutate(alternate: value) + return self.mutate(alternate: .init(value, context: .tainted(.html))) } func asynchronously() -> Tag { - return self.mutate(async: "async") + return self.mutate(async: .init("async", context: .trusted)) } func autocomplete(_ value: Values.Completion) -> Tag { - return mutate(autocomplete: value.rawValue) + return mutate(autocomplete: .init(value.rawValue, context: .trusted)) } func autocomplete(_ values: OrderedSet) -> Tag { - return mutate(autocomplete: values.map { $0.rawValue }.joined(separator: " ")) + return mutate(autocomplete: .init(values.map { $0.rawValue }.joined(separator: " "), context: .trusted)) } func autoplay(_ condition: Bool = true) -> Tag { if condition { - return mutate(autoplay: "autoplay") + return mutate(autoplay: .init("autoplay", context: .trusted)) } return self } func charset(_ value: Values.Charset) -> Tag { - return self.mutate(charset: value.rawValue) + return self.mutate(charset: .init(value.rawValue, context: .trusted)) } func checked(_ condition: Bool = true) -> Tag { if condition { - return mutate(checked: "checked") + return mutate(checked: .init("checked", context: .trusted)) } return self } func cite(_ value: String) -> Tag { - return self.mutate(cite: value) + return self.mutate(cite: .init(value, context: .tainted(.html))) } func columns(_ size: Int) -> Tag { - return self.mutate(cols: size) + return self.mutate(cols: .init(size, context: .trusted)) } func columnSpan(_ size: Int) -> Tag { - return self.mutate(colspan: size) + return self.mutate(colspan: .init(size, context: .trusted)) } func content(_ value: String) -> Tag { - return mutate(content: value) + return mutate(content: .init(value, context: .tainted(.html))) } func content(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Tag { - return mutate(content: LocalizedString(key: localizedKey, table: tableName)) + return mutate(content: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } func content(verbatim value: String) -> Tag { - return mutate(content: value) + return mutate(content: .init(value, context: .tainted(.html))) } func controls() -> Tag { - return self.mutate(controls: "controls") + return self.mutate(controls: .init("controls", context: .trusted)) } func coordinates(_ value: String) -> Tag { - return self.mutate(coords: value) + return self.mutate(coords: .init(value, context: .tainted(.html))) } func data(_ value: String) -> Tag { - return self.mutate(data: value) + return self.mutate(data: .init(value, context: .tainted(.html))) } func dateTime(_ value: String) -> Tag { - return self.mutate(datetime: value) + return self.mutate(datetime: .init(value, context: .tainted(.html))) } func `default`() -> Tag { - return self.mutate(default: "default") + return self.mutate(default: .init("default", context: .trusted)) } func `defer`() -> Tag { - return self.mutate(defer: "defer") + return self.mutate(defer: .init("defer", context: .trusted)) } func disabled(_ condition: Bool = true) -> Tag { if condition { - return mutate(disabled: "disabled") + return mutate(disabled: .init("disabled", context: .trusted)) } return self } func download() -> Tag { - return self.mutate(download: "download") + return self.mutate(download: .init("download", context: .trusted)) } func encoding(_ value: Values.Encoding) -> Tag { - return self.mutate(enctype: value.rawValue) + return self.mutate(enctype: .init(value.rawValue, context: .trusted)) } func `for`(_ value: String) -> Tag { - return self.mutate(for: value) + return self.mutate(for: .init(value, context: .tainted(.html))) } func form(_ value: String) -> Tag { - return self.mutate(form: value) + return self.mutate(form: .init(value, context: .tainted(.html))) } func formAction(_ value: String) -> Tag { - return self.mutate(formaction: value) + return self.mutate(formaction: .init(value, context: .tainted(.html))) } func equivalent(_ value: Values.Equivalent) -> Tag { - return self.mutate(httpequiv: value.rawValue) + return self.mutate(httpequiv: .init(value.rawValue, context: .trusted)) } func headers(_ ids: [String]) -> Tag { - return self.mutate(headers: ids.joined(separator: " ")) + return self.mutate(headers: .init(ids.joined(separator: " "), context: .tainted(.html))) } func headers(_ ids: String...) -> Tag { - return self.mutate(headers: ids.joined(separator: " ")) + return self.mutate(headers: .init(ids.joined(separator: " "), context: .tainted(.html))) } func height(_ size: Int) -> Tag { - return self.mutate(height: size) + return self.mutate(height: .init(size, context: .trusted)) } func high(_ size: Float) -> Tag { - return self.mutate(high: size) + return self.mutate(high: .init(size, context: .trusted)) } func reference(_ value: String) -> Tag { - return self.mutate(href: value) + return self.mutate(href: .init(value, context: .tainted(.url))) } func referenceLanguage(_ value: Values.Language) -> Tag { - return self.mutate(hreflang: value.rawValue) + return self.mutate(hreflang: .init(value.rawValue, context: .trusted)) } func isMap() -> Tag { - return self.mutate(ismap: "ismap") + return self.mutate(ismap: .init("ismap", context: .trusted)) } func kind(_ value: Values.Kind) -> Tag { - return self.mutate(kind: value.rawValue) + return self.mutate(kind: .init(value.rawValue, context: .trusted)) } @_disfavoredOverload func label(_ value: String) -> Tag { - return self.mutate(label: value) + return self.mutate(label: .init(value, context: .tainted(.html))) } func label(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Tag { - return self.mutate(label: LocalizedString(key: localizedKey, table: tableName)) + return self.mutate(label: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } func label(verbatim value: String) -> Tag { - return self.mutate(label: value) + return self.mutate(label: .init(value, context: .tainted(.html))) } func list(_ value: String) -> Tag { - return self.mutate(list: value) + return self.mutate(list: .init(value, context: .tainted(.html))) } func loop(_ condition: Bool = true) -> Tag { if condition { - return self.mutate(loop: "loop") + return self.mutate(loop: .init("loop", context: .trusted)) } return self } func low(_ size: Float) -> Tag { - return self.mutate(low: size) + return self.mutate(low: .init(size, context: .trusted)) } func maximum(_ value: String) -> Tag { - return self.mutate(max: value) + return self.mutate(max: .init(value, context: .tainted(.html))) } func maximum(length value: Int) -> Tag { - return self.mutate(maxlength: value) + return self.mutate(maxlength: .init(value, context: .trusted)) } func media(_ value: String) -> Tag { - return self.mutate(media: value) + return self.mutate(media: .init(value, context: .tainted(.html))) } func media(_ queries: [MediaQuery]) -> Tag { - return self.mutate(media: queries.map { $0.rawValue }.joined(separator: ", ")) + return self.mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } func media(_ queries: MediaQuery...) -> Tag { - return self.mutate(media: queries.map { $0.rawValue }.joined(separator: ", ")) + return self.mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } func method(_ value: HTMLKit.Values.Method) -> Tag { - return self.mutate(method: value.rawValue) + return self.mutate(method: .init(value.rawValue, context: .trusted)) } func minimum(_ value: Float) -> Tag { - return self.mutate(min: value) + return self.mutate(min: .init(value, context: .trusted)) } func minimum(length value: Int) -> Tag { - return self.mutate(minlength: value) + return self.mutate(minlength: .init(value, context: .trusted)) } func multiple() -> Tag { - return self.mutate(multiple: "multiple") + return self.mutate(multiple: .init("multiple", context: .trusted)) } func muted() -> Tag { - return self.mutate(muted: "muted") + return self.mutate(muted: .init( "muted", context: .trusted)) } func name(_ value: String) -> Tag { - return self.mutate(name: value) + return self.mutate(name: .init(value, context: .tainted(.html))) } func novalidate() -> Tag { - return self.mutate(novalidate: "novalidate") + return self.mutate(novalidate: .init("novalidate", context: .trusted)) } func open(_ condition: Bool = true) -> Tag { if condition { - return self.mutate(open: "open") + return self.mutate(open: .init("open", context: .trusted)) } return self } func optimum(_ value: Float) -> Tag { - return self.mutate(optimum: value) + return self.mutate(optimum: .init(value, context: .trusted)) } func pattern(_ regex: String) -> Tag { - return self.mutate(pattern: regex) + return self.mutate(pattern: .init(regex, context: .tainted(.html))) } func part(_ value: String) -> Tag { - return self.mutate(part: value) + return self.mutate(part: .init(value, context: .tainted(.html))) } func ping(_ value: String) -> Tag { - return self.mutate(ping: value) + return self.mutate(ping: .init(value, context: .tainted(.html))) } @_disfavoredOverload func placeholder(_ value: String) -> Tag { - return self.mutate(placeholder: value) + return self.mutate(placeholder: .init(value, context: .tainted(.html))) } func placeholder(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Tag { - return self.mutate(placeholder: LocalizedString(key: localizedKey, table: tableName)) + return self.mutate(placeholder: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } func placeholder(verbatim value: String) -> Tag { - return self.mutate(placeholder: value) + return self.mutate(placeholder: .init(value, context: .tainted(.html))) } func playInline(_ condition: Bool = true) -> Tag { if condition { - return mutate(playsinline: "playsinline") + return mutate(playsinline: .init("playsinline", context: .trusted)) } return self } func poster(_ value: String) -> Tag { - return self.mutate(poster: value) + return self.mutate(poster: .init(value, context: .tainted(.html))) } func preload(_ value: Values.Preload) -> Tag { - return self.mutate(preload: value.rawValue) + return self.mutate(preload: .init(value.rawValue, context: .trusted)) } func readonly(_ condition: Bool = true) -> Tag { if condition { - return mutate(readonly: "readonly") + return mutate(readonly: .init("readonly", context: .trusted)) } return self } func referrerPolicy(_ value: Values.Policy) -> Tag { - return self.mutate(referrerpolicy: value.rawValue) + return self.mutate(referrerpolicy: .init(value.rawValue, context: .trusted)) } func relationship(_ value: Values.Relation) -> Tag { - return self.mutate(rel: value.rawValue) + return self.mutate(rel: .init(value.rawValue, context: .trusted)) } func required(_ condition: Bool = true) -> Tag { if condition { - return mutate(required: "required") + return mutate(required: .init("required", context: .trusted)) } return self } func reversed() -> Tag { - return self.mutate(reversed: "reversed") + return self.mutate(reversed: .init("reversed", context: .trusted)) } func rows(_ size: Int) -> Tag { - return self.mutate(rows: size) + return self.mutate(rows: .init(size, context: .trusted)) } func rowSpan(_ size: Int) -> Tag { - return self.mutate(rowspan: size) + return self.mutate(rowspan: .init(size, context: .trusted)) } func sandbox() -> Tag { - return self.mutate(sandbox: "sandbox") + return self.mutate(sandbox: .init("sandbox", context: .trusted)) } func sandbox(_ value: Values.Permission) -> Tag { - return self.mutate(sandbox: value.rawValue) + return self.mutate(sandbox: .init(value.rawValue, context: .trusted)) } func sandbox(_ values: OrderedSet) -> Tag { - return self.mutate(sandbox: values.map { $0.rawValue }.joined(separator: " ")) + return self.mutate(sandbox: .init(values.map { $0.rawValue }.joined(separator: " "), context: .trusted)) } func scope(_ value: Values.Scope) -> Tag { - return self.mutate(scope: value.rawValue) + return self.mutate(scope: .init(value.rawValue, context: .trusted)) } func shape() -> Tag { - return self.mutate(shape: "default") + return self.mutate(shape: .init("default", context: .trusted)) } func shape(_ value: Values.Shape, coordinates: String) -> Tag { - return self.mutate(shape: value.rawValue).mutate(coords: coordinates) + return self.mutate(shape: .init(value.rawValue, context: .trusted)).mutate(coords: .init(coordinates, context: .tainted(.html))) } func size(_ size: Int) -> Tag { - return self.mutate(size: size) + return self.mutate(size: .init(size, context: .trusted)) } func sizes(_ candidates: [SizeCandidate]) -> Tag { - return self.mutate(sizes: candidates.map { $0.rawValue }.joined(separator: ", ")) + return self.mutate(sizes: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } func sizes(_ candidates: SizeCandidate...) -> Tag { - return self.mutate(sizes: candidates.map { $0.rawValue }.joined(separator: ", ")) + return self.mutate(sizes: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } func slot(_ value: String) -> Tag { - return self.mutate(slot: value) + return self.mutate(slot: .init(value, context: .tainted(.html))) } func span(_ size: Int) -> Tag { - return self.mutate(span: size) + return self.mutate(span: .init(size, context: .trusted)) } func source(_ value: String) -> Tag { - return self.mutate(source: value) + return self.mutate(source: .init(value, context: .tainted(.html))) } func source(_ value: EnvironmentValue) -> Tag { - return mutate(source: value) + return mutate(source: .init(value, context: .tainted(.html))) } func sourceDocument(_ value: String) -> Tag { - return mutate(sourcedocument: value) + return mutate(sourcedocument: .init(value, context: .tainted(.html))) } func sourceLanguage(_ value: Values.Language) -> Tag { - return mutate(sourcelanguage: value.rawValue) + return mutate(sourcelanguage: .init(value.rawValue, context: .trusted)) } func sourceSet(_ candidates: [SourceCandidate]) -> Tag { - return mutate(sourceset: candidates.map { $0.rawValue }.joined(separator: ", ")) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } func sourceSet(_ candidates: SourceCandidate...) -> Tag { - return mutate(sourceset: candidates.map { $0.rawValue }.joined(separator: ", ")) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) } func start(_ size: Int) -> Tag { - return self.mutate(start: size) + return self.mutate(start: .init(size, context: .trusted)) } func step(_ size: Int) -> Tag { - return self.mutate(step: size) + return self.mutate(step: .init(size, context: .trusted)) } func target(_ value: Values.Target) -> Tag { - return self.mutate(target: value.rawValue) + return self.mutate(target: .init(value.rawValue, context: .trusted)) } func type(_ value: String) -> Tag { - return self.mutate(type: value) + return self.mutate(type: .init(value, context: .tainted(.html))) } @_disfavoredOverload func value(_ value: String) -> Tag { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } func value(_ localizedKey: LocalizedStringKey, tableName: String? = nil) -> Tag { - return mutate(value: LocalizedString(key: localizedKey, table: tableName)) + return mutate(value: .init(LocalizedString(key: localizedKey, table: tableName), context: .tainted(.html))) } func value(verbatim value: String) -> Tag { - return mutate(value: value) + return mutate(value: .init(value, context: .tainted(.html))) } func width(_ size: Int) -> Tag { - return self.mutate(width: size) + return self.mutate(width: .init(size, context: .trusted)) } func wrap(_ value: Values.Wrapping) -> Tag { - return self.mutate(wrap: value.rawValue) + return self.mutate(wrap: .init(value.rawValue, context: .trusted)) } func property(_ value: Values.Graph) -> Tag { - return self.mutate(property: value.rawValue) + return self.mutate(property: .init(value.rawValue, context: .trusted)) } func selected(_ condition: Bool = true) -> Tag { if condition { - return self.mutate(selected: "selected") + return self.mutate(selected: .init("selected", context: .trusted)) } return self } func draw(_ value: String) -> Tag { - return self.mutate(draw: value) + return self.mutate(draw: .init(value, context: .tainted(.html))) } func fill(_ color: String, opacity: Double? = nil) -> Tag { - return self.mutate(fill: color).mutate(fillopacity: opacity) + + var copy = self + + copy = copy.mutate(fill: .init(color, context: .tainted(.html))) + + if let opacity = opacity { + copy = copy.mutate(fillopacity: .init(opacity, context: .trusted)) + } + + return copy + } + + func fillOpacity(_ value: Double) -> Tag { + return self.mutate(fillopacity: .init(value, context: .trusted)) } public func stroke(_ color: String, width: Int? = nil, opacity: Double? = nil, cap: Values.Linecap? = nil, join: Values.Linejoin? = nil) -> Tag { - return self.mutate(stroke: color).mutate(strokewidth: width).mutate(strokeopacity: opacity).mutate(strokelinecap: cap?.rawValue).mutate(strokelinejoin: join?.rawValue) + + var copy = self + + copy = copy.mutate(stroke: .init(color, context: .tainted(.html))) + + if let width = width { + copy = copy.mutate(strokewidth: .init(width, context: .trusted)) + } + + if let opacity = opacity { + copy = copy.mutate(strokeopacity: .init(opacity, context: .trusted)) + } + + if let cap = cap { + copy = copy.mutate(strokelinecap: .init(cap.rawValue, context: .trusted)) + } + + if let join = join { + copy = copy.mutate(strokelinejoin: .init(join.rawValue, context: .trusted)) + } + + return copy } func strokeWidth(_ size: Int) -> Tag { - return self.mutate(strokewidth: size) + return self.mutate(strokewidth: .init(size, context: .trusted)) } func strokeOpacity(_ value: Double) -> Tag { - return self.mutate(strokeopacity: value) + return self.mutate(strokeopacity: .init(value, context: .trusted)) } func strokeLineCap(_ value: HTMLKit.Values.Linecap) -> Tag { - return self.mutate(strokelinecap: value.rawValue) + return self.mutate(strokelinecap: .init(value.rawValue, context: .trusted)) } func strokeLineJoin(_ value: HTMLKit.Values.Linejoin) -> Tag { - return self.mutate(strokelinejoin: value.rawValue) + return self.mutate(strokelinejoin: .init(value.rawValue, context: .trusted)) } func radius(_ size: Int) -> Tag { - return self.mutate(radius: size) + return self.mutate(radius: .init(size, context: .trusted)) } func positionPoint(_ point: (Int, Int)) -> Tag { - return self.mutate(x: "\(point.0)").mutate(y: "\(point.1)") + return self.mutate(x: .init(point.0, context: .trusted)).mutate(y: .init(point.1, context: .trusted)) } func position(x: Int, y: Int) -> Tag { - return self.mutate(x: "\(x)").mutate(y: "\(y)") + return self.mutate(x: .init(x, context: .trusted)).mutate(y: .init(x, context: .trusted)) } func position(x: Double, y: Double) -> Tag { - return self.mutate(x: "\(x)").mutate(y: "\(y)") + return self.mutate(x: .init(x, context: .trusted)).mutate(y: .init(y, context: .trusted)) } func position(_ point: UnitPoint) -> Tag { - return self.mutate(x: point.x).mutate(y: point.y) + return self.mutate(x: .init(point.x, context: .trusted)).mutate(y: .init(point.y, context: .trusted)) } func radiusPoint(_ point: (Int, Int)) -> Tag { - return self.mutate(rx: "\(point.0)").mutate(ry: "\(point.1)") + return self.mutate(rx: .init(point.0, context: .trusted)).mutate(ry: .init(point.1, context: .trusted)) } func radius(x: Int, y: Int) -> Tag { - return self.mutate(rx: "\(x)").mutate(ry: "\(y)") + return self.mutate(rx: .init(x, context: .trusted)).mutate(ry: .init(y, context: .trusted)) } func radius(x: Double, y: Double) -> Tag { - return self.mutate(rx: "\(x)").mutate(ry: "\(y)") + return self.mutate(rx: .init(x, context: .trusted)).mutate(ry: .init(y, context: .trusted)) } func radius(_ point: HTMLKit.UnitPoint) -> Tag { - return self.mutate(rx: point.x).mutate(ry: point.y) + return self.mutate(rx: .init(point.x, context: .trusted)).mutate(ry: .init(point.y, context: .trusted)) } func centerPoint(_ point: (Int, Int)) -> Tag { - return self.mutate(cx: "\(point.0)").mutate(cy: "\(point.1)") + return self.mutate(cx: .init(point.0, context: .trusted)).mutate(cy: .init(point.1, context: .trusted)) } func center(x: Int, y: Int) -> Tag { - return self.mutate(cx: "\(x)").mutate(cy: "\(y)") + return self.mutate(cx: .init(x, context: .trusted)).mutate(cy: .init(y, context: .trusted)) } func center(x: Double, y: Double) -> Tag { - return self.mutate(cx: "\(x)").mutate(cy: "\(y)") + return self.mutate(cx: .init(x, context: .trusted)).mutate(cy: .init(y, context: .trusted)) } func center(_ point: UnitPoint) -> Tag { - return self.mutate(cx: point.x).mutate(cy: point.y) + return self.mutate(cx: .init(point.x, context: .trusted)).mutate(cy: .init(point.y, context: .trusted)) } func viewBox(_ value: String) -> Tag { - return self.mutate(viewbox: value) + return self.mutate(viewbox: .init(value, context: .tainted(.html))) } func viewBox(x: Int, y: Int, width: Int, height: Int) -> Tag { - return self.mutate(viewbox: "\(x) \(y) \(width) \(height)") + return self.mutate(viewbox: .init("\(x) \(y) \(width) \(height)", context: .trusted)) } func viewBox(x: Double, y: Double, width: Double, height: Double) -> Tag { - return self.mutate(viewbox: "\(x) \(y) \(width) \(height)") + return self.mutate(viewbox: .init("\(x) \(y) \(width) \(height)", context: .trusted)) } func namespace(_ value: String) -> Tag { - return self.mutate(namespace: value) + return self.mutate(namespace: .init(value, context: .tainted(.html))) } func points(_ value: String) -> Tag { - return self.mutate(points: value) + return self.mutate(points: .init(value, context: .tainted(.html))) } func fetchPriority(_ value: Values.Priority) -> Tag { - return self.mutate(fetchpriority: value.rawValue) + return self.mutate(fetchpriority: .init(value.rawValue, context: .trusted)) } func loading(_ value: Values.Loading) -> Tag { - return self.mutate(loading: value.rawValue) + return self.mutate(loading: .init(value.rawValue, context: .trusted)) } func decoding(_ value: Values.Decoding) -> Tag { - return self.mutate(decoding: value.rawValue) + return self.mutate(decoding: .init(value.rawValue, context: .trusted)) } func popover(_ value: Values.Popover.State) -> Tag { - return self.mutate(popover: value.rawValue) + return self.mutate(popover: .init(value.rawValue, context: .trusted)) } func popoverTarget(_ id: String, action: Values.Popover.Action? = nil) -> Tag { - return self.mutate(popovertarget: id).mutate(popovertargetaction: action?.rawValue) + + var copy = self + + copy = copy.mutate(popovertarget: .init(id, context: .tainted(.html))) + + if let action = action { + copy = copy.mutate(popoveraction: .init(action.rawValue, context: .trusted)) + } + + return copy } func popoverAction(_ value: Values.Popover.Action) -> Tag { - return self.mutate(popoveraction: value.rawValue) + return self.mutate(popoveraction: .init(value.rawValue, context: .trusted)) } func useMap(_ id: String) -> Tag { - return mutate(usemap: id) + return mutate(usemap: .init("#\(id)", context: .tainted(.html))) + } + + func custom(key: String, value: String, context: EscapeContext = .tainted(.html)) -> Tag { + return mutate(key: key, value: .init(value, context: context)) + } + + func custom(key: String, value: Int) -> Tag { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + func custom(key: String, value: Double) -> Tag { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + func custom(key: String, value: Bool) -> Tag { + return mutate(key: key, value: .init(value, context: .trusted)) + } + + func custom(key: String, value: Float) -> Tag { + return mutate(key: key, value: .init(value, context: .trusted)) } - func custom(key: String, value: Any) -> Tag { - return self.mutate(key: key, value: value) + func custom(key: String, value: EnvironmentValue, context: EscapeContext = .tainted(.html)) -> Tag { + return mutate(key: key, value: .init(value, context: context)) } func blocking(_ value: Values.Blocking) -> Tag { - return self.mutate(blocking: value.rawValue) + return self.mutate(blocking: .init(value.rawValue, context: .trusted)) } func integrity(_ hashes: String...) -> Tag { - return self.mutate(integrity: hashes.joined(separator: " ")) + return self.mutate(integrity: .init(hashes.joined(separator: " "), context: .tainted(.html))) } func integrity(_ hashes: [String]) -> Tag { - return self.mutate(integrity: hashes.joined(separator: " ")) + return self.mutate(integrity: .init(hashes.joined(separator: " "), context: .tainted(.html))) } func crossOrigin(_ value: Credential.Mode) -> Tag { - return self.mutate(crossorigin: value.rawValue) + return self.mutate(crossorigin: .init(value.rawValue, context: .trusted)) } func on(event: Events.Window, _ value: String) -> Tag { - return self.mutate(key: event.rawValue, value: value) + return self.mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } func on(event: Events.Focus, _ value: String) -> Tag { - return self.mutate(key: event.rawValue, value: value) + return self.mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } func on(event: Events.Pointer, _ value: String) -> Tag { - return self.mutate(key: event.rawValue, value: value) + return self.mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } func on(event: Events.Mouse, _ value: String) -> Tag { - return self.mutate(key: event.rawValue, value: value) + return self.mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } func on(event: Events.Wheel, _ value: String) -> Tag { - return self.mutate(key: event.rawValue, value: value) + return self.mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } func on(event: Events.Input, _ value: String) -> Tag { - return self.mutate(key: event.rawValue, value: value) + return self.mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } func on(event: Events.Keyboard, _ value: String) -> Tag { - return self.mutate(key: event.rawValue, value: value) + return self.mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } func on(event: Events.Drag, _ value: String) -> Tag { - return self.mutate(key: event.rawValue, value: value) + return self.mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } func on(event: Events.Clipboard, _ value: String) -> Tag { - return self.mutate(key: event.rawValue, value: value) + return self.mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } func on(event: Events.Selection, _ value: String) -> Tag { - return self.mutate(key: event.rawValue, value: value) + return self.mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } func on(event: Events.Media, _ value: String) -> Tag { - return self.mutate(key: event.rawValue, value: value) + return self.mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } func on(event: Events.Form, _ value: String) -> Tag { - return self.mutate(key: event.rawValue, value: value) + return self.mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } func on(event: Events.Detail, _ value: String) -> Tag { - return self.mutate(key: event.rawValue, value: value) + return self.mutate(key: event.rawValue, value: .init(value, context: .tainted(.js))) } func aria(atomic value: Bool) -> Tag { - return mutate(ariaatomic: value) + return mutate(ariaatomic: .init(value, context: .trusted)) } func aria(busy value: Bool) -> Tag { - return mutate(ariabusy: value) + return mutate(ariabusy: .init(value, context: .trusted)) } func aria(controls value: String) -> Tag { - return mutate(ariacontrols: value) + return mutate(ariacontrols: .init(value, context: .tainted(.html))) } func aria(current value: Values.Accessibility.Current) -> Tag { - return mutate(ariacurrent: value.rawValue) + return mutate(ariacurrent: .init(value.rawValue, context: .trusted)) } func aria(describedBy value: String) -> Tag { - return mutate(ariadescribedby: value) + return mutate(ariadescribedby: .init(value, context: .tainted(.html))) } func aria(details value: String) -> Tag { - return mutate(ariadetails: value) + return mutate(ariadetails: .init(value, context: .tainted(.html))) } func aria(disabled value: Bool) -> Tag { - return mutate(ariadisabled: value) + return mutate(ariadisabled: .init(value, context: .trusted)) } func aria(errorMessage value: String) -> Tag { - return mutate(ariaerrormessage: value) + return mutate(ariaerrormessage: .init(value, context: .tainted(.html))) } func aria(flowTo value: String) -> Tag { - return mutate(ariaflowto: value) + return mutate(ariaflowto: .init(value, context: .tainted(.html))) } func aria(hasPopup value: Values.Accessibility.Popup) -> Tag { - return mutate(ariahaspopup: value.rawValue) + return mutate(ariahaspopup: .init(value.rawValue, context: .trusted)) } func aria(hidden value: Bool) -> Tag { - return mutate(ariahidden: value) + return mutate(ariahidden: .init(value, context: .trusted)) } func aria(invalid value: Values.Accessibility.Invalid) -> Tag { - return mutate(ariainvalid: value.rawValue) + return mutate(ariainvalid: .init(value.rawValue, context: .trusted)) } func aria(keyShortcuts value: String) -> Tag { - return mutate(ariakeyshortcuts: value) + return mutate(ariakeyshortcuts: .init(value, context: .tainted(.html))) } func aria(label value: String) -> Tag { - return mutate(arialabel: value) + return mutate(arialabel: .init(value, context: .tainted(.html))) } func aria(labeledBy value: String) -> Tag { - return mutate(arialabeledby: value) + return mutate(arialabeledby: .init(value, context: .tainted(.html))) } func aria(live value: Values.Accessibility.Live) -> Tag { - return mutate(arialive: value.rawValue) + return mutate(arialive: .init(value.rawValue, context: .trusted)) } func aria(owns value: String) -> Tag { - return mutate(ariaowns: value) + return mutate(ariaowns: .init(value, context: .tainted(.html))) } func aria(relevant value: Values.Accessibility.Relevant) -> Tag { - return mutate(ariarelevant: value.rawValue) + return mutate(ariarelevant: .init(value.rawValue, context: .trusted)) } func aria(roleDescription value: String) -> Tag { - return mutate(ariaroledescription: value) + return mutate(ariaroledescription: .init(value, context: .tainted(.html))) } func shadowRootMode(_ value: Values.Shadow.Mode) -> Tag { - return mutate(shadowrootmode: value.rawValue) + return mutate(shadowrootmode: .init(value.rawValue, context: .trusted)) } func inert(_ condition: Bool = true) -> Tag { if condition { - return mutate(inert: "inert") + return mutate(inert: .init("inert", context: .trusted)) } return self @@ -2470,11 +2565,17 @@ final class AttributesTests: XCTestCase { let view = TestView { Tag {}.custom(key: "data-animal-type", value: "bird") + Tag {}.custom(key: "data-row-index", value: 2) + Tag {}.custom(key: "data-cart-total", value: 20.0) + Tag {}.custom(key: "aria-hidden", value: false) } XCTAssertEqual(try renderer.render(view: view), """ - + \ + \ + \ + """ ) } From a3e8b6937d43b1085007d37216aa6d26a91685d0 Mon Sep 17 00:00:00 2001 From: Mattes Mohr Date: Sat, 24 Jan 2026 12:57:15 +0100 Subject: [PATCH 4/5] Adjust the renderer --- .../Rendering/Encoding/TaintedString.swift | 46 -- .../Framework/Rendering/Renderer.swift | 485 +++++++----------- 2 files changed, 197 insertions(+), 334 deletions(-) delete mode 100644 Sources/HTMLKit/Framework/Rendering/Encoding/TaintedString.swift diff --git a/Sources/HTMLKit/Framework/Rendering/Encoding/TaintedString.swift b/Sources/HTMLKit/Framework/Rendering/Encoding/TaintedString.swift deleted file mode 100644 index 516bbf4b..00000000 --- a/Sources/HTMLKit/Framework/Rendering/Encoding/TaintedString.swift +++ /dev/null @@ -1,46 +0,0 @@ -/// A type that represents an untrusted string. -/// -/// The tainted string comes from an untrusted source and must be escaped by the renderer, -/// before it is getting consumed. -internal struct TaintedString: Content { - - /// An enumeration of potential source contexts - internal enum Context { - - /// The subcontext within a source context - internal enum Subcontext { - - /// Consider an attribute value - case attribute - - /// Consider an element body - case element - } - - /// Consider an HTML context - case html(Subcontext) - - /// Consider a CSS context - case css(Subcontext) - - /// Consider a JS context - case js(Subcontext) - } - - /// The string value marked as tainted - internal let value: String - - /// The context of the source of the string - internal let context: Context - - /// Create a tainted string. - /// - /// - Parameters: - /// - value: The string value - /// - context: The context the string is coming from - internal init(_ value: String, as context: Context) { - - self.value = value - self.context = context - } -} diff --git a/Sources/HTMLKit/Framework/Rendering/Renderer.swift b/Sources/HTMLKit/Framework/Rendering/Renderer.swift index 54b8a8be..8eed167e 100644 --- a/Sources/HTMLKit/Framework/Rendering/Renderer.swift +++ b/Sources/HTMLKit/Framework/Rendering/Renderer.swift @@ -95,7 +95,7 @@ public struct Renderer { var result = "" if let contents = view.body as? [Content] { - try render(contents: contents, on: &result) + try render(contents: contents, on: &result, within: .tainted(.html)) } return result @@ -106,13 +106,13 @@ public struct Renderer { /// - Parameter contents: The content to process /// /// - Returns: A string representation of the content - private func render(contents: [Content], on result: inout String) throws { + private func render(contents: [Content], on result: inout String, within context: EscapeContext) throws { for content in contents { switch content { case let content as [Content]: - try render(contents: content, on: &result) + try render(contents: content, on: &result, within: context) case let view as View: result += try render(view: view) @@ -132,50 +132,27 @@ public struct Renderer { case let element as any CustomNode: try render(element: element, on: &result) - case let modifier as EnvironmentModifier: - try render(modifier: modifier, on: &result) - - case let value as EnvironmentValue: - result += try render(envelement: value) - - case let statement as Statement: - try render(statement: statement, on: &result) - - case let sequence as Sequence: - try render(loop: sequence, on: &result) - - case let string as LocalizedString: - result += try render(localized: string) - - case let string as MarkdownString: + case let string as String: - if !features.contains(.markdown) { - result += escape(tainted: .init(string.raw, as: .html(.element))) + switch context { + case .trusted: + result += string - } else { - result += try render(markstring: string) + case .tainted(let subcontext): + result += escape(element: string, with: subcontext) } - case let string as EnvironmentString: - try render(envstring: string, on: &result) - - case let string as HtmlString: - result += string.value - - case let string as TaintedString: - result += escape(tainted: string) - - case let doubleValue as Double: - result += String(doubleValue) + case let double as Double: + result += "\(double)" - case let floatValue as Float: - result += String(floatValue) + case let int as Int: + result += "\(int)" - case let intValue as Int: - result += String(intValue) + case let float as Float: + result += "\(float)" - case let stringValue as String: - result += escape(tainted: .init(stringValue, as: .html(.element))) + case let bool as Bool: + result += "\(bool)" case let date as Date: @@ -185,6 +162,37 @@ public struct Renderer { formatter.timeStyle = .short result += formatter.string(from: date) + + case let string as LocalizedString: + + switch context { + case .trusted: + result += try render(localized: string) + + case .tainted(let subcontext): + result += escape(element: try render(localized: string), with: subcontext) + } + + case let string as MarkdownString: + result += try render(markdownstring: string, within: context) + + case let modifier as EnvironmentModifier: + try render(modifier: modifier, on: &result, within: context) + + case let value as EnvironmentValue: + result += try render(envelement: value, within: context) + + case let statement as Statement: + try render(statement: statement, on: &result, within: context) + + case let sequence as Sequence: + try render(loop: sequence, on: &result, within: context) + + case let string as EnvironmentString: + try render(envstring: string, on: &result, within: context) + + case let string as HtmlString: + result += string.value default: throw Error.unknownContentType @@ -239,7 +247,13 @@ public struct Renderer { result += "" } @@ -253,7 +267,13 @@ public struct Renderer { result += "" } @@ -274,7 +294,7 @@ public struct Renderer { result += ">" if let contents = element.content as? [Content] { - try render(contents: contents, on: &result) + try render(contents: contents, on: &result, within: element.context) } result += "" @@ -338,13 +358,13 @@ public struct Renderer { /// - Parameter modifier: The modifier to apply to /// /// - Returns: The string interpolation of the fellow content - private func render(modifier: EnvironmentModifier, on result: inout String) throws { + private func render(modifier: EnvironmentModifier, on result: inout String, within context: EscapeContext) throws { if let value = modifier.value { self.environment.upsert(value, for: modifier.key) } - try render(contents: modifier.content, on: &result) + try render(contents: modifier.content, on: &result, within: context) } /// Renders a environment value @@ -352,11 +372,21 @@ public struct Renderer { /// - Parameter value: The environment value to resolve /// /// - Returns: The string representation - private func render(envattribute value: EnvironmentValue) throws -> String { + private func render(envattribute value: EnvironmentValue, within context: EscapeContext) throws -> String { let value = try self.environment.resolve(value: value) switch value { + case let stringValue as String: + + switch context { + case .trusted: + return stringValue + + case .tainted(let subcontext): + return escape(attribute: stringValue, with: subcontext) + } + case let floatValue as Float: return String(floatValue) @@ -366,9 +396,6 @@ public struct Renderer { case let doubleValue as Double: return String(doubleValue) - case let stringValue as String: - return escape(tainted: .init(stringValue, as: .html(.attribute))) - case let dateValue as Date: let formatter = DateFormatter() @@ -388,11 +415,21 @@ public struct Renderer { /// - Parameter value: The environment value to resolve /// /// - Returns: The string representation - private func render(envelement value: EnvironmentValue) throws -> String { + private func render(envelement value: EnvironmentValue, within context: EscapeContext) throws -> String { let value = try self.environment.resolve(value: value) switch value { + case let stringValue as String: + + switch context { + case .trusted: + return stringValue + + case .tainted(let subcontext): + return escape(element: stringValue, with: subcontext) + } + case let floatValue as Float: return String(floatValue) @@ -402,9 +439,6 @@ public struct Renderer { case let doubleValue as Double: return String(doubleValue) - case let stringValue as String: - return escape(tainted: .init(stringValue, as: .html(.element))) - case let dateValue as Date: let formatter = DateFormatter() @@ -424,7 +458,7 @@ public struct Renderer { /// - Parameter statement: The statement to resolve /// /// - Returns: The rendered condition - private func render(statement: Statement, on result: inout String) throws { + private func render(statement: Statement, on result: inout String, within context: EscapeContext) throws { var evaluation = false @@ -446,10 +480,10 @@ public struct Renderer { } if evaluation { - try render(contents: statement.first, on: &result) + try render(contents: statement.first, on: &result, within: context) } else { - try render(contents: statement.second, on: &result) + try render(contents: statement.second, on: &result, within: context) } } @@ -464,70 +498,46 @@ public struct Renderer { result += " \(attribute.key)=\"" - switch attribute.value.context { - case .trusted: + switch attribute.value.value { + case .string(let string): - switch attribute.value.value { - case .string(let string): - + switch attribute.value.context { + case .trusted: result += string - case .bool(let bool): - - result += "\(bool)" - - case .double(let double): - - result += "\(double)" - - case .float(let float): - - result += "\(float)" - - case .int(let int): - - result += "\(int)" - - case .localized(let localized): - - result += try render(localized: localized) - - case .environment(let environment): - - result += try render(envattribute: environment) + case .tainted(let subcontext): + result += escape(attribute: string, with: subcontext) } - case .tainted(let subcontext): + case .bool(let bool): - switch attribute.value.value { - case .string(let string): - - result += escape(attribute: string, with: subcontext) - - case .bool(let bool): - - result += "\(bool)" - - case .double(let double): - - result += "\(double)" - - case .float(let float): - - result += "\(float)" - - case .int(let int): - - result += "\(int)" - - case .localized(let localized): - + result += "\(bool)" + + case .double(let double): + + result += "\(double)" + + case .float(let float): + + result += "\(float)" + + case .int(let int): + + result += "\(int)" + + case .localized(let localized): + + switch attribute.value.context { + case .trusted: result += try render(localized: localized) - case .environment(let environment): - - result += try render(envattribute: environment) + case .tainted(let subcontext): + result += try escape(attribute: render(localized: localized), with: subcontext) } + + case .environment(let environment): + + result += try render(envattribute: environment, within: attribute.value.context) } result += "\"" @@ -539,8 +549,19 @@ public struct Renderer { /// - Parameter markstring: The string to render /// /// - Returns: The string representation - private func render(markstring: MarkdownString) throws -> String { - return markdown.render(string: escape(tainted: .init(markstring.raw, as: .html(.element)))) + private func render(markdownstring: MarkdownString, within context: EscapeContext) throws -> String { + + if !features.contains(.markdown) { + return markdownstring.raw + } + + switch context { + case .trusted: + return self.markdown.render(string: markdownstring.raw) + + case .tainted(let subcontext): + return self.markdown.render(string: escape(element: markdownstring.raw, with: subcontext)) + } } /// Renders a environment string @@ -548,8 +569,8 @@ public struct Renderer { /// - Parameter envstring: The string to render /// /// - Returns: The string representation - private func render(envstring: EnvironmentString, on result: inout String) throws { - return try render(contents: envstring.values, on: &result) + private func render(envstring: EnvironmentString, on result: inout String, within context: EscapeContext) throws { + return try render(contents: envstring.values, on: &result, within: context) } /// Renders an environment loop @@ -557,7 +578,7 @@ public struct Renderer { /// - Parameter loop: The sequence to resolve /// /// - Returns: The string representation - private func render(loop: Sequence, on result: inout String) throws { + private func render(loop: Sequence, on result: inout String, within context: EscapeContext) throws { let value = try environment.resolve(value: loop.value) @@ -566,7 +587,7 @@ public struct Renderer { } for value in sequence { - try render(loop: loop.content, with: value, on: &result) + try render(loop: loop.content, with: value, on: &result, within: context) } } @@ -576,16 +597,13 @@ public struct Renderer { /// - contents: The content to render /// - value: The value to resolve the environment value with /// - result: The rendered content - private func render(loop contents: [Content], with value: Any, on result: inout String) throws { + private func render(loop contents: [Content], with value: Any, on result: inout String, within context: EscapeContext) throws { for content in contents { switch content { case let element as any ContentNode: - try render(loop: element, with: value, on: &result) - - case let element as any CustomNode: - try render(loop: element, with: value, on: &result) + try render(loop: element, with: value, on: &result, within: context) case let element as EmptyNode: try render(element: element, on: &result) @@ -593,27 +611,48 @@ public struct Renderer { case let element as CommentNode: render(element: element, on: &result) + case let element as any CustomNode: + try render(loop: element, with: value, on: &result, within: context) + + case let string as String: + + switch context { + case .trusted: + result += string + + case .tainted(let subcontext): + result += escape(element: string, with: subcontext) + } + case let string as LocalizedString: - result += try render(localized: string) + + switch context { + case .trusted: + result += try render(localized: string) + + case .tainted(let subcontext): + result += escape(element: try render(localized: string), with: subcontext) + } case let string as MarkdownString: - result += try render(markstring: string) + result += try render(markdownstring: string, within: context) case let string as EnvironmentString: - try render(envstring: string, on: &result) - - case let string as HtmlString: - result += string.value - - case let string as TaintedString: - result += escape(tainted: string) - - case let string as String: - result += escape(tainted: .init(string, as: .html(.element))) + try render(envstring: string, on: &result, within: context) case is EnvironmentValue: switch value { + case let stringValue as String: + + switch context { + case .trusted: + result += stringValue + + case .tainted(let subcontext): + result += escape(element: stringValue, with: subcontext) + } + case let floatValue as Float: result += String(floatValue) @@ -623,9 +662,6 @@ public struct Renderer { case let doubleValue as Double: result += String(doubleValue) - case let stringValue as String: - result += escape(tainted: .init(stringValue, as: .html(.element))) - case let dateValue as Date: let formatter = DateFormatter() @@ -639,6 +675,9 @@ public struct Renderer { throw Error.unknownValueType } + case let string as HtmlString: + result += string.value + default: throw Error.unknownContentType } @@ -651,7 +690,7 @@ public struct Renderer { /// - element: The element to render /// - value: The value to resolve the environment value with /// - result: The result - private func render(loop element: some ContentNode, with value: Any, on result: inout String) throws { + private func render(loop element: some ContentNode, with value: Any, on result: inout String, within context: EscapeContext) throws { result += "<\(element.name)" @@ -662,7 +701,7 @@ public struct Renderer { result += ">" if let contents = element.content as? [Content] { - try render(loop: contents, with: value, on: &result) + try render(loop: contents, with: value, on: &result, within: context) } result += "" @@ -674,7 +713,7 @@ public struct Renderer { /// - element: The element to render /// - value: The value to resolve the environment value with /// - result: The string representation - private func render(loop element: some CustomNode, with value: Any, on result: inout String) throws { + private func render(loop element: some CustomNode, with value: Any, on result: inout String, within context: EscapeContext) throws { result += "<\(element.name)" @@ -685,7 +724,7 @@ public struct Renderer { result += ">" if let contents = element.content as? [Content] { - try render(loop: contents, with: value, on: &result) + try render(loop: contents, with: value, on: &result, within: context) } result += "" @@ -697,161 +736,21 @@ public struct Renderer { /// - envstring: The environment string to render /// - value: The raw value to resolve the environment value with /// - result: The string representation - private func render(loop envstring: EnvironmentString, with value: Any, on result: inout String) throws { - try render(loop: envstring.values, with: value, on: &result) + private func render(loop envstring: EnvironmentString, with value: Any, on result: inout String, within context: EscapeContext) throws { + try render(loop: envstring.values, with: value, on: &result, within: context) } - /// Escapes a tainted string - /// - /// It takes precautions such as output encoding and input sanitization to ensure a safe output. Though the escaping alone - /// does not guarantee complete safety. It only helps mitigate the risk. + /// Escapes a tainted element. /// /// - Parameter string: The string value to escape. + /// - Parameter context: The context of the string. /// /// - Returns: The untainted string - private func escape(tainted string: TaintedString) -> String { - - if !features.contains(.escaping) { - - // Bail early, if the escaping is not desired - return string.value - } - - switch string.context { - case .html(let subcontext): - - switch subcontext { - case .attribute: - return encoder.encode(string.value, as: .html(.attribute)) - - case .element: - return encoder.encode(string.value, as: .html(.element)) - } - - case .css(let subcontext): - - switch subcontext { - case .attribute: - return encoder.encode(string.value, as: .css(.attribute)) - - case .element: - - // To prevent breaking out of context - let sanitized = sanitizer.strip("style", from: string.value) - - return encoder.encode(sanitized, as: .css(.element)) - } - - case .js(let subcontext): - - switch subcontext { - case .attribute: - return encoder.encode(string.value, as: .js(.attribute)) - - case .element: - - // To prevent breaking out of context - let sanitized = sanitizer.strip("script", from: string.value) - - return encoder.encode(sanitized, as: .js(.element)) - } - } - } - - private func render(contents: [Content], on result: inout String, within context: EscapeContext) throws { + private func escape(element string: String, with context: EscapeContext.Subcontext) -> String { - for content in contents { - - switch content { - case let content as [Content]: - try render(contents: content, on: &result, within: context) - - case let view as View: - result += try render(view: view) - - case let element as any ContentNode: - try render(element: element, on: &result) - - case let element as EmptyNode: - try render(element: element, on: &result) - - case let element as DocumentNode: - render(element: element, on: &result) - - case let element as CommentNode: - render(element: element, on: &result) - - case let element as any CustomNode: - try render(element: element, on: &result) - - case let modifier as EnvironmentModifier: - try render(modifier: modifier, on: &result) - - case let value as EnvironmentValue: - result += try render(envelement: value) - - case let statement as Statement: - try render(statement: statement, on: &result) - - case let sequence as Sequence: - try render(loop: sequence, on: &result) - - case let string as LocalizedString: - result += try render(localized: string) - - case let string as MarkdownString: - - if !features.contains(.markdown) { - result += escape(tainted: .init(string.raw, as: .html(.element))) - - } else { - result += try render(markstring: string) - } - - case let string as EnvironmentString: - try render(envstring: string, on: &result) - - case let string as HtmlString: - result += string.value - - case let string as TaintedString: - result += escape(tainted: string) - - case let doubleValue as Double: - result += String(doubleValue) - - case let floatValue as Float: - result += String(floatValue) - - case let intValue as Int: - result += String(intValue) - - case let stringValue as String: - - switch context { - case .trusted: - result += stringValue - - case .tainted(let subcontext): - result += escape(element: stringValue, with: subcontext) - } - - case let date as Date: - - let formatter = DateFormatter() - formatter.timeZone = environment.timeZone ?? TimeZone.current - formatter.dateStyle = .medium - formatter.timeStyle = .short - - result += formatter.string(from: date) - - default: - throw Error.unknownContentType - } + if !features.contains(.escaping) { + return string } - } - - private func escape(element string: String, with context: EscapeContext.Subcontext) -> String { switch context { case .html: @@ -876,8 +775,18 @@ public struct Renderer { } } + /// Escapes a tainted attribute. + /// + /// - Parameter string: The string value to escape. + /// - Parameter context: The context of the string. + /// + /// - Returns: The untainted string private func escape(attribute string: String, with context: EscapeContext.Subcontext) -> String { + if !features.contains(.escaping) { + return string + } + switch context { case .html: return encoder.encode(string, as: .html(.attribute)) From f68206782f3f37b604a81454b056eee84b1a7641 Mon Sep 17 00:00:00 2001 From: Mattes Mohr Date: Sat, 24 Jan 2026 13:50:01 +0100 Subject: [PATCH 5/5] Use correct context --- .../HTMLKit/Abstraction/Elements/BodyElements.swift | 12 ++++++------ .../HTMLKit/Abstraction/Elements/HeadElements.swift | 8 ++++---- .../HTMLKit/Abstraction/Elements/MediaElements.swift | 12 ++++++------ Tests/HTMLKitTests/AttributesTests.swift | 12 ++++++------ 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Sources/HTMLKit/Abstraction/Elements/BodyElements.swift b/Sources/HTMLKit/Abstraction/Elements/BodyElements.swift index 92e60ec5..88d04660 100644 --- a/Sources/HTMLKit/Abstraction/Elements/BodyElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/BodyElements.swift @@ -9164,11 +9164,11 @@ extension Anchor: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, } public func media(_ queries: [MediaQuery]) -> Anchor { - return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func media(_ queries: MediaQuery...) -> Anchor { - return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func ping(_ value: String) -> Anchor { @@ -21593,19 +21593,19 @@ extension Image: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, } public func sourceSet(_ candidates: [SourceCandidate]) -> Image { - return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func sourceSet(_ candidates: SourceCandidate...) -> Image { - return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func sizes(_ candidates: [SizeCandidate]) -> Image { - return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func sizes(_ candidates: SizeCandidate...) -> Image { - return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func width(_ size: Int) -> Image { diff --git a/Sources/HTMLKit/Abstraction/Elements/HeadElements.swift b/Sources/HTMLKit/Abstraction/Elements/HeadElements.swift index 6123f5e0..7156f700 100644 --- a/Sources/HTMLKit/Abstraction/Elements/HeadElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/HeadElements.swift @@ -1204,11 +1204,11 @@ extension Style: GlobalAttributes, GlobalEventAttributes, TypeAttribute, MediaAt } public func media(_ queries: [MediaQuery]) -> Style { - return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func media(_ queries: MediaQuery...) -> Style { - return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func blocking(_ value: Values.Blocking) -> Style { @@ -1533,11 +1533,11 @@ extension Link: GlobalAttributes, GlobalEventAttributes, ReferenceAttribute, Ref } public func media(_ queries: [MediaQuery]) -> Link { - return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func media(_ queries: MediaQuery...) -> Link { - return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func referrerPolicy(_ value: Values.Policy) -> Link { diff --git a/Sources/HTMLKit/Abstraction/Elements/MediaElements.swift b/Sources/HTMLKit/Abstraction/Elements/MediaElements.swift index 3fdaaf10..d2170227 100644 --- a/Sources/HTMLKit/Abstraction/Elements/MediaElements.swift +++ b/Sources/HTMLKit/Abstraction/Elements/MediaElements.swift @@ -262,19 +262,19 @@ extension Source: GlobalAttributes, GlobalEventAttributes, TypeAttribute, Source } public func sourceSet(_ candidates: [SourceCandidate]) -> Source { - return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func sourceSet(_ candidates: SourceCandidate...) -> Source { - return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func sizes(_ candidates: [SizeCandidate]) -> Source { - return mutate(sizes: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(sizes: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func sizes(_ candidates: SizeCandidate...) -> Source { - return mutate(sizes: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(sizes: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func media(_ value: String) -> Source { @@ -282,11 +282,11 @@ extension Source: GlobalAttributes, GlobalEventAttributes, TypeAttribute, Source } public func media(_ queries: [MediaQuery]) -> Source { - return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func media(_ queries: MediaQuery...) -> Source { - return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } public func width(_ size: Int) -> Source { diff --git a/Tests/HTMLKitTests/AttributesTests.swift b/Tests/HTMLKitTests/AttributesTests.swift index 0fa37984..aa0681bf 100644 --- a/Tests/HTMLKitTests/AttributesTests.swift +++ b/Tests/HTMLKitTests/AttributesTests.swift @@ -410,11 +410,11 @@ final class AttributesTests: XCTestCase { } func media(_ queries: [MediaQuery]) -> Tag { - return self.mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return self.mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } func media(_ queries: MediaQuery...) -> Tag { - return self.mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return self.mutate(media: .init(queries.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } func method(_ value: HTMLKit.Values.Method) -> Tag { @@ -567,11 +567,11 @@ final class AttributesTests: XCTestCase { } func sizes(_ candidates: [SizeCandidate]) -> Tag { - return self.mutate(sizes: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return self.mutate(sizes: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } func sizes(_ candidates: SizeCandidate...) -> Tag { - return self.mutate(sizes: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return self.mutate(sizes: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } func slot(_ value: String) -> Tag { @@ -599,11 +599,11 @@ final class AttributesTests: XCTestCase { } func sourceSet(_ candidates: [SourceCandidate]) -> Tag { - return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } func sourceSet(_ candidates: SourceCandidate...) -> Tag { - return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .trusted)) + return mutate(sourceset: .init(candidates.map { $0.rawValue }.joined(separator: ", "), context: .tainted(.html))) } func start(_ size: Int) -> Tag {