Skip to content

Commit 840aecc

Browse files
authored
Introduce the playsinline attribute (#170)
1 parent 7e47c7e commit 840aecc

File tree

3 files changed

+70
-2
lines changed

3 files changed

+70
-2
lines changed

Sources/HTMLKit/Abstraction/Attributes/BasicAttributes.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1961,6 +1961,39 @@ extension PosterAttribute where Self: EmptyNode {
19611961
}
19621962
}
19631963

1964+
/// A type that provides the `playInline` modifier.
1965+
public protocol PlaysInlineAttribute: Attribute {
1966+
1967+
/// Enables inline playback
1968+
///
1969+
/// It specifies that the element should not use the native fullscreen mode when playing.
1970+
///
1971+
/// ```swift
1972+
/// Video {
1973+
/// }
1974+
/// .playInline()
1975+
/// ```
1976+
///
1977+
/// - Parameter condition: Whether the element should play inline
1978+
///
1979+
/// - Returns: The element
1980+
func playInline(_ condition: Bool) -> Self
1981+
}
1982+
1983+
extension PlaysInlineAttribute where Self: ContentNode {
1984+
1985+
internal func mutate(playsinline value: String) -> Self {
1986+
return self.mutate(key: "playsinline", value: value)
1987+
}
1988+
}
1989+
1990+
extension PlaysInlineAttribute where Self: EmptyNode {
1991+
1992+
internal func mutate(playsinline value: String) -> Self {
1993+
return self.mutate(key: "playsinline", value: value)
1994+
}
1995+
}
1996+
19641997
/// The protocol provides the element with the preload handler.
19651998
@_documentation(visibility: internal)
19661999
public protocol PreloadAttribute: Attribute {

Sources/HTMLKit/Abstraction/Elements/BodyElements.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16860,7 +16860,7 @@ public struct Video: ContentNode, HtmlElement, BodyElement, FormElement, FigureE
1686016860
}
1686116861
}
1686216862

16863-
extension Video: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, SourceAttribute, AutoplayAttribute, LoopAttribute, MutedAttribute, ControlsAttribute, WidthAttribute, HeightAttribute, PreloadAttribute {
16863+
extension Video: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes, SourceAttribute, AutoplayAttribute, LoopAttribute, MutedAttribute, ControlsAttribute, WidthAttribute, HeightAttribute, PreloadAttribute, PlaysInlineAttribute {
1686416864

1686516865
public func accessKey(_ value: Character) -> Video {
1686616866
return mutate(accesskey: value)
@@ -17043,6 +17043,15 @@ extension Video: GlobalAttributes, GlobalEventAttributes, GlobalAriaAttributes,
1704317043
return mutate(popover: value.rawValue)
1704417044
}
1704517045

17046+
public func playInline(_ condition: Bool = true) -> Video {
17047+
17048+
if condition {
17049+
return mutate(playsinline: "playsinline")
17050+
}
17051+
17052+
return self
17053+
}
17054+
1704617055
public func custom(key: String, value: Any) -> Video {
1704717056
return mutate(key: key, value: value)
1704817057
}

Tests/HTMLKitTests/AttributesTests.swift

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ final class AttributesTests: XCTestCase {
1414
@ContentBuilder<Content> var body: Content
1515
}
1616

17-
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 & EnterKeyHintAttribute & ForAttribute & FormAttribute & FormActionAttribute & EquivalentAttribute & HeaderAttribute & HeightAttribute & HiddenAttribute & HighAttribute & ReferenceAttribute & ReferenceLanguageAttribute & IdentifierAttribute & IsMapAttribute & InputModeAttribute & IsAttribute & ItemIdAttribute & ItemPropertyAttribute & ItemReferenceAttribute & ItemScopeAttribute & ItemTypeAttribute & 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 & ReadyOnlyAttribute & 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
17+
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 & EnterKeyHintAttribute & ForAttribute & FormAttribute & FormActionAttribute & EquivalentAttribute & HeaderAttribute & HeightAttribute & HiddenAttribute & HighAttribute & ReferenceAttribute & ReferenceLanguageAttribute & IdentifierAttribute & IsMapAttribute & InputModeAttribute & IsAttribute & ItemIdAttribute & ItemPropertyAttribute & ItemReferenceAttribute & ItemScopeAttribute & ItemTypeAttribute & 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 & ReadyOnlyAttribute & 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
1818

1919
struct Tag: ContentNode, GlobalElement, AllAttributes {
2020

@@ -386,6 +386,15 @@ final class AttributesTests: XCTestCase {
386386
return self.mutate(placeholder: value)
387387
}
388388

389+
func playInline(_ condition: Bool = true) -> Tag {
390+
391+
if condition {
392+
return mutate(playsinline: "playsinline")
393+
}
394+
395+
return self
396+
}
397+
389398
func poster(_ value: String) -> Tag {
390399
return self.mutate(poster: value)
391400
}
@@ -1719,6 +1728,23 @@ final class AttributesTests: XCTestCase {
17191728
)
17201729
}
17211730

1731+
func testPlaysInlineAttribute() throws {
1732+
1733+
let view = TestView {
1734+
Tag {}.playInline()
1735+
Tag {}.playInline(false)
1736+
Tag {}.playInline(true)
1737+
}
1738+
1739+
XCTAssertEqual(try renderer.render(view: view),
1740+
"""
1741+
<tag playsinline="playsinline"></tag>\
1742+
<tag></tag>\
1743+
<tag playsinline="playsinline"></tag>
1744+
"""
1745+
)
1746+
}
1747+
17221748
func testPosterAttribute() throws {
17231749

17241750
let view = TestView {

0 commit comments

Comments
 (0)