@@ -25,49 +25,80 @@ extension InlineNode {
2525 var size : MarkdownImageSize ? {
2626 switch self {
2727 case . text( let input) :
28- let pattern = " \\ {(?:width \\ s*= \\ s*( \\ d+)px \\ s*)?(?:height \\ s*= \\ s*( \\ d+)px \\ s*)?(?:width \\ s*= \\ s*( \\ d+)px \\ s*)?(?:height \\ s*= \\ s*( \\ d+)px \\ s*)? \\ } "
28+ // Trying first to found a fixed pattern match
29+ let fixedPattern = " \\ {(?:width \\ s*= \\ s*( \\ d+)px \\ s*)?(?:height \\ s*= \\ s*( \\ d+)px \\ s*)?(?:width \\ s*= \\ s*( \\ d+)px \\ s*)?(?:height \\ s*= \\ s*( \\ d+)px \\ s*)? \\ } "
2930
30- guard let regex = try ? NSRegularExpression ( pattern : pattern , options : [ ] ) else {
31- return nil
31+ if let ( width , height ) = extract ( regexPattern : fixedPattern , from : input ) {
32+ return MarkdownImageSize ( value : . fixed ( width , height ) )
3233 }
3334
34- let range = NSRange ( input. startIndex..< input. endIndex, in: input)
35- guard let match = regex. firstMatch ( in: input, options: [ ] , range: range) else {
36- return nil
37- }
38-
39- var width : CGFloat ?
40- var height : CGFloat ?
35+ // Trying then to found a relative pattern match
36+ let relativePattern = " \\ {(?:width \\ s*= \\ s*( \\ d+)% \\ s*)?(?:height \\ s*= \\ s*( \\ d+)% \\ s*)?(?:width \\ s*= \\ s*( \\ d+)% \\ s*)?(?:height \\ s*= \\ s*( \\ d+)% \\ s*)? \\ } "
4137
42- if let widthRange = Range ( match. range ( at: 1 ) , in: input) , let widthValue = Int ( input [ widthRange] ) {
43- width = CGFloat ( widthValue)
44- } else if let widthRange = Range ( match. range ( at: 3 ) , in: input) , let widthValue = Int ( input [ widthRange] ) {
45- width = CGFloat ( widthValue)
38+ if let ( wRatio, hRatio) = extract ( regexPattern: relativePattern, from: input) {
39+ return MarkdownImageSize ( value: . relative( ( wRatio ?? 100 ) / 100 , ( hRatio ?? 100 ) / 100 ) )
4640 }
4741
48- if let heightRange = Range ( match. range ( at: 2 ) , in: input) , let heightValue = Int ( input [ heightRange] ) {
49- height = CGFloat ( heightValue)
50- } else if let heightRange = Range ( match. range ( at: 4 ) , in: input) , let heightValue = Int ( input [ heightRange] ) {
51- height = CGFloat ( heightValue)
52- }
53-
54- return MarkdownImageSize ( width: width, height: height)
42+ return nil
5543 default :
5644 return nil
5745 }
5846 }
47+
48+ private func extract(
49+ regexPattern pattern: String ,
50+ from input: String
51+ ) -> ( width: CGFloat ? , height: CGFloat ? ) ? {
52+ guard let regex = try ? NSRegularExpression ( pattern: pattern, options: [ ] ) else {
53+ return nil
54+ }
55+
56+ let range = NSRange ( input. startIndex..< input. endIndex, in: input)
57+ guard let match = regex. firstMatch ( in: input, options: [ ] , range: range) else {
58+ return nil
59+ }
60+
61+ var width : CGFloat ?
62+ var height : CGFloat ?
63+
64+ if let widthRange = Range ( match. range ( at: 1 ) , in: input) , let widthValue = Int ( input [ widthRange] ) {
65+ width = CGFloat ( widthValue)
66+ } else if let widthRange = Range ( match. range ( at: 3 ) , in: input) , let widthValue = Int ( input [ widthRange] ) {
67+ width = CGFloat ( widthValue)
68+ }
69+
70+ if let heightRange = Range ( match. range ( at: 2 ) , in: input) , let heightValue = Int ( input [ heightRange] ) {
71+ height = CGFloat ( heightValue)
72+ } else if let heightRange = Range ( match. range ( at: 4 ) , in: input) , let heightValue = Int ( input [ heightRange] ) {
73+ height = CGFloat ( heightValue)
74+ }
75+
76+ return ( width, height)
77+ }
5978}
6079
6180/// A value type representating an image size suffix.
6281///
63- /// Example: `{width=50px}`
82+ /// Example:
83+ /// - `{width=50px}`
84+ /// - `{width=50%}`
6485///
65- /// Suffix can be either
66- /// - {width=50px}
67- /// - {height=50px}
68- /// - {width=50px height=100px}
69- /// - {height=50px width=100px}
86+ /// Suffix can either be:
87+ /// - `{width=50px}`
88+ /// - `{height=50px}`
89+ /// - `{width=50px height=100px}`
90+ /// - `{height=50px width=100px}`
91+ /// - `{width=50%}`
92+ /// - `{height=50%}`
93+ /// - `{width=50% height=100%}`
94+ /// - `{height=50% width=100%}`
7095struct MarkdownImageSize {
71- let width : CGFloat ?
72- let height : CGFloat ?
96+ let value : Value
97+
98+ enum Value {
99+ /// Represents a fixed value size:`.fixed(width, height)`
100+ case fixed( CGFloat ? , CGFloat ? )
101+ /// Represents a relative value size: `.relative(proportionalWidth, proportionalHeight)`
102+ case relative( CGFloat , CGFloat )
103+ }
73104}
0 commit comments