@@ -68,185 +68,4 @@ public extension String {
6868 self . replace ( " \" " , with: " " " )
6969 self . replace ( " ' " , with: " ' " )
7070 }
71- }
72-
73- // MARK: CSSUnit
74- public extension HTMLElementAttribute {
75- enum CSSUnit : HTMLInitializable { // https://www.w3schools.com/cssref/css_units.php
76- // absolute
77- case centimeters( _ value: Float ? )
78- case millimeters( _ value: Float ? )
79- /// 1 inch = 96px = 2.54cm
80- case inches( _ value: Float ? )
81- /// 1 pixel = 1/96th of 1inch
82- case pixels( _ value: Float ? )
83- /// 1 point = 1/72 of 1inch
84- case points( _ value: Float ? )
85- /// 1 pica = 12 points
86- case picas( _ value: Float ? )
87-
88- // relative
89- /// Relative to the font-size of the element (2em means 2 times the size of the current font)
90- case em( _ value: Float ? )
91- /// Relative to the x-height of the current font (rarely used)
92- case ex( _ value: Float ? )
93- /// Relative to the width of the "0" (zero)
94- case ch( _ value: Float ? )
95- /// Relative to font-size of the root element
96- case rem( _ value: Float ? )
97- /// Relative to 1% of the width of the viewport
98- case viewportWidth( _ value: Float ? )
99- /// Relative to 1% of the height of the viewport
100- case viewportHeight( _ value: Float ? )
101- /// Relative to 1% of viewport's smaller dimension
102- case viewportMin( _ value: Float ? )
103- /// Relative to 1% of viewport's larger dimension
104- case viewportMax( _ value: Float ? )
105- /// Relative to the parent element
106- case percent( _ value: Float ? )
107-
108- public init ? ( context: some MacroExpansionContext , key: String , arguments: LabeledExprListSyntax ) {
109- let expression : ExprSyntax = arguments. first!. expression
110- func float( ) -> Float ? {
111- guard let s: String = expression. integerLiteral? . literal. text ?? expression. floatLiteral? . literal. text else { return nil }
112- return Float ( s)
113- }
114- switch key {
115- case " centimeters " : self = . centimeters( float ( ) )
116- case " millimeters " : self = . millimeters( float ( ) )
117- case " inches " : self = . inches( float ( ) )
118- case " pixels " : self = . pixels( float ( ) )
119- case " points " : self = . points( float ( ) )
120- case " picas " : self = . picas( float ( ) )
121-
122- case " em " : self = . em( float ( ) )
123- case " ex " : self = . ex( float ( ) )
124- case " ch " : self = . ch( float ( ) )
125- case " rem " : self = . rem( float ( ) )
126- case " viewportWidth " : self = . viewportWidth( float ( ) )
127- case " viewportHeight " : self = . viewportHeight( float ( ) )
128- case " viewportMin " : self = . viewportMin( float ( ) )
129- case " viewportMax " : self = . viewportMax( float ( ) )
130- case " percent " : self = . percent( float ( ) )
131- default : return nil
132- }
133- }
134-
135- public var key : String {
136- switch self {
137- case . centimeters( _) : return " centimeters "
138- case . millimeters( _) : return " millimeters "
139- case . inches( _) : return " inches "
140- case . pixels( _) : return " pixels "
141- case . points( _) : return " points "
142- case . picas( _) : return " picas "
143-
144- case . em( _) : return " em "
145- case . ex( _) : return " ex "
146- case . ch( _) : return " ch "
147- case . rem( _) : return " rem "
148- case . viewportWidth( _) : return " viewportWidth "
149- case . viewportHeight( _) : return " viewportHeight "
150- case . viewportMin( _) : return " viewportMin "
151- case . viewportMax( _) : return " viewportMax "
152- case . percent( _) : return " percent "
153- }
154- }
155-
156- public var htmlValue : String ? {
157- switch self {
158- case . centimeters( let v) ,
159- . millimeters( let v) ,
160- . inches( let v) ,
161- . pixels( let v) ,
162- . points( let v) ,
163- . picas( let v) ,
164-
165- . em( let v) ,
166- . ex( let v) ,
167- . ch( let v) ,
168- . rem( let v) ,
169- . viewportWidth( let v) ,
170- . viewportHeight( let v) ,
171- . viewportMin( let v) ,
172- . viewportMax( let v) ,
173- . percent( let v) :
174- guard let v: Float = v else { return nil }
175- var s : String = String ( describing: v)
176- while s. last == " 0 " {
177- s. removeLast ( )
178- }
179- if s. last == " . " {
180- s. removeLast ( )
181- }
182- return s + suffix
183- }
184- }
185-
186- public var htmlValueIsVoidable : Bool { false }
187-
188- public var suffix : String {
189- switch self {
190- case . centimeters( _) : return " cm "
191- case . millimeters( _) : return " mm "
192- case . inches( _) : return " in "
193- case . pixels( _) : return " px "
194- case . points( _) : return " pt "
195- case . picas( _) : return " pc "
196-
197- case . em( _) : return " em "
198- case . ex( _) : return " ex "
199- case . ch( _) : return " ch "
200- case . rem( _) : return " rem "
201- case . viewportWidth( _) : return " vw "
202- case . viewportHeight( _) : return " vh "
203- case . viewportMin( _) : return " vmin "
204- case . viewportMax( _) : return " vmax "
205- case . percent( _) : return " % "
206- }
207- }
208- }
209- }
210-
211- // MARK: LiteralReturnType
212- public enum LiteralReturnType {
213- case boolean( Bool )
214- case string( String )
215- case int( Int )
216- case float( Float )
217- case interpolation( String )
218- case array( [ Any ] )
219-
220- public var isInterpolation : Bool {
221- switch self {
222- case . interpolation( _) : return true
223- default : return false
224- }
225- }
226- public var isString : Bool {
227- switch self {
228- case . string( _) : return true
229- default : return false
230- }
231- }
232-
233- public func value( key: String ) -> String ? {
234- switch self {
235- case . boolean( let b) : return b ? key : nil
236- case . string( var string) :
237- if string. isEmpty && key == " attributionsrc " {
238- return " "
239- }
240- string. escapeHTML ( escapeAttributes: true )
241- return string
242- case . int( let int) :
243- return String ( describing: int)
244- case . float( let float) :
245- return String ( describing: float)
246- case . interpolation( let string) :
247- return string
248- case . array( _) :
249- return nil
250- }
251- }
25271}
0 commit comments