1
1
import { resizeImage } from './image'
2
- import type { BadgePreset , Sponsor , SponsorkitRenderOptions , Sponsorship } from '../types'
2
+ import type { BadgePreset , ImageFormat , Sponsor , SponsorkitRenderOptions , Sponsorship } from '../types'
3
3
4
4
let id = 0
5
5
export function genSvgImage (
6
6
x : number ,
7
7
y : number ,
8
8
size : number ,
9
- base64Image : string ,
10
9
radius : number ,
10
+ base64Image : string ,
11
+ imageFormat : ImageFormat ,
11
12
) {
12
13
const cropId = `c${ id ++ } `
13
14
return `
14
15
<clipPath id="${ cropId } ">
15
16
<rect x="${ x } " y="${ y } " width="${ size } " height="${ size } " rx="${ size * radius } " ry="${ size * radius } " />
16
17
</clipPath>
17
- <image x="${ x } " y="${ y } " width="${ size } " height="${ size } " href="data:image/png ;base64,${ base64Image } " clip-path="url(#${ cropId } )"/>`
18
+ <image x="${ x } " y="${ y } " width="${ size } " height="${ size } " href="data:image/${ imageFormat } ;base64,${ base64Image } " clip-path="url(#${ cropId } )"/>`
18
19
}
19
20
20
21
export async function generateBadge (
@@ -23,8 +24,8 @@ export async function generateBadge(
23
24
sponsor : Sponsor ,
24
25
preset : BadgePreset ,
25
26
radius : number ,
27
+ imageFormat : ImageFormat ,
26
28
) {
27
- const size = preset . avatar . size
28
29
const { login } = sponsor
29
30
let name = ( sponsor . name || sponsor . login ) . trim ( )
30
31
const url = sponsor . websiteUrl || sponsor . linkUrl
@@ -36,24 +37,25 @@ export async function generateBadge(
36
37
name = `${ name . slice ( 0 , preset . name . maxLength - 3 ) } ...`
37
38
}
38
39
39
- let avatar
40
+ const { size } = preset . avatar
41
+ let avatar = sponsor . avatarBuffer !
40
42
if ( size < 50 ) {
41
- avatar = await resizeImage ( sponsor . avatarBuffer ! , 50 )
43
+ avatar = await resizeImage ( avatar , 50 , imageFormat )
42
44
}
43
- else if ( size < 90 ) {
44
- avatar = await resizeImage ( sponsor . avatarBuffer ! , 80 )
45
+ else if ( size < 80 ) {
46
+ avatar = await resizeImage ( avatar , 80 , imageFormat )
45
47
}
46
- else {
47
- avatar = await resizeImage ( sponsor . avatarBuffer ! , 120 )
48
+ else if ( imageFormat === 'png' ) {
49
+ avatar = await resizeImage ( avatar , 120 , imageFormat )
48
50
}
49
51
50
- avatar = avatar . toString ( 'base64' )
52
+ const avatarBase64 = avatar . toString ( 'base64' )
51
53
52
54
return `<a ${ url ? `href="${ url } " ` : '' } class="${ preset . classes || 'sponsorkit-link' } " target="_blank" id="${ login } ">
53
55
${ preset . name
54
56
? `<text x="${ x + size / 2 } " y="${ y + size + 18 } " text-anchor="middle" class="${ preset . name . classes || 'sponsorkit-name' } " fill="${ preset . name . color || 'currentColor' } ">${ encodeHtmlEntities ( name ) } </text>
55
57
`
56
- : '' } ${ genSvgImage ( x , y , size , avatar , radius ) }
58
+ : '' } ${ genSvgImage ( x , y , size , radius , avatarBase64 , imageFormat ) }
57
59
</a>` . trim ( )
58
60
}
59
61
@@ -90,7 +92,7 @@ export class SvgComposer {
90
92
const x = offsetX + preset . boxWidth * i
91
93
const y = this . height
92
94
const radius = s . sponsor . type === 'Organization' ? 0.1 : 0.5
93
- return await generateBadge ( x , y , s . sponsor , preset , radius )
95
+ return await generateBadge ( x , y , s . sponsor , preset , radius , this . config . imageFormat )
94
96
} ) )
95
97
96
98
this . body += sponsorLine . join ( '\n' )
0 commit comments