@blockspoon/cert-badge-renderer 1.0.4 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -9
- package/dist/browser/index.d.ts +1 -0
- package/dist/browser/index.js +3 -1
- package/dist/utils/generateDesignHTML.js +12 -42
- package/package.json +1 -1
- package/src/browser/index.ts +1 -0
- package/src/utils/generateDesignHTML.ts +12 -44
package/README.md
CHANGED
|
@@ -22,7 +22,7 @@ npm install @blockspoon/cert-badge-renderer
|
|
|
22
22
|
|
|
23
23
|
## 📝 사용법 예제
|
|
24
24
|
|
|
25
|
-
### 1. 인증서 또는 배지 HTML
|
|
25
|
+
### 1. 인증서 또는 배지 객체 기반으로 HTML 생성하기
|
|
26
26
|
|
|
27
27
|
```ts
|
|
28
28
|
import { generateAchievementHTML } from "@blockspoon/cert-badge-renderer/browser";
|
|
@@ -34,7 +34,7 @@ const html = await generateAchievementHTML(achievement, {
|
|
|
34
34
|
});
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
### 2. 인증서 또는 배지 PNG 이미지 생성
|
|
37
|
+
<!-- ### 2. 인증서 또는 배지 PNG 이미지 생성
|
|
38
38
|
|
|
39
39
|
```ts
|
|
40
40
|
import { generateAchievementFile } from "@blockspoon/cert-badge-renderer/server";
|
|
@@ -49,21 +49,21 @@ const result = await generateAchievementFile(achievement, {
|
|
|
49
49
|
// Base64 저장 예시
|
|
50
50
|
const base64 = result.base64.replace(/^data:image\/png;base64,/, "");
|
|
51
51
|
require("fs").writeFileSync("certificate.png", Buffer.from(base64, "base64"));
|
|
52
|
-
```
|
|
52
|
+
``` -->
|
|
53
53
|
|
|
54
|
-
###
|
|
54
|
+
### 2. 디자인 객체 기반으로 HTML 생성하기
|
|
55
55
|
|
|
56
56
|
```ts
|
|
57
57
|
import { generateDesignHTML } from "@blockspoon/cert-badge-renderer/browser";
|
|
58
58
|
|
|
59
59
|
// certificateDesign: https://developers.kolleges.net/docs/design_get_certificate#certificatedesign-object
|
|
60
60
|
// badgeDesign: https://developers.kolleges.net/docs/design_get_badge#badgedesign-object
|
|
61
|
-
const html = await generateDesignHTML(certificateDesign || badgeDesign
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
const html = await generateDesignHTML(certificateDesign || badgeDesign, {
|
|
62
|
+
size: 600, // 렌더링 크기 (px)
|
|
63
|
+
});
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
-
### 4. 디자인(JSON) 기반으로 PNG 생성하기
|
|
66
|
+
<!-- ### 4. 디자인(JSON) 기반으로 PNG 생성하기
|
|
67
67
|
|
|
68
68
|
```ts
|
|
69
69
|
import { generateDesignFile } from "@blockspoon/cert-badge-renderer/server";
|
|
@@ -75,7 +75,7 @@ const png = await generateDesignFile(certificateDesign || badgeDesign);
|
|
|
75
75
|
require("fs").writeFileSync("badge.png", png.buffer);
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
---
|
|
78
|
+
--- -->
|
|
79
79
|
|
|
80
80
|
## 🔐 API Key 사용 방식
|
|
81
81
|
|
package/dist/browser/index.d.ts
CHANGED
package/dist/browser/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generateAchievementHTML = void 0;
|
|
3
|
+
exports.generateDesignHTML = exports.generateAchievementHTML = void 0;
|
|
4
4
|
// ✅ src/browser/index.ts
|
|
5
5
|
var generateAchievementHTML_1 = require("../utils/generateAchievementHTML");
|
|
6
6
|
Object.defineProperty(exports, "generateAchievementHTML", { enumerable: true, get: function () { return generateAchievementHTML_1.generateAchievementHTML; } });
|
|
7
|
+
var generateDesignHTML_1 = require("../utils/generateDesignHTML");
|
|
8
|
+
Object.defineProperty(exports, "generateDesignHTML", { enumerable: true, get: function () { return generateDesignHTML_1.generateDesignHTML; } });
|
|
@@ -19,36 +19,6 @@ const qrcode_1 = __importDefault(require("qrcode"));
|
|
|
19
19
|
const svgTemplate_1 = require("../templates/svgTemplate");
|
|
20
20
|
const certificates_1 = __importDefault(require("../templates/certificates"));
|
|
21
21
|
const componentsDirection_1 = require("../constants/componentsDirection");
|
|
22
|
-
function convertImageToBase64(url) {
|
|
23
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
24
|
-
try {
|
|
25
|
-
// URL이 이미 baseUrl을 포함하고 있는지 확인
|
|
26
|
-
let finalUrls = [];
|
|
27
|
-
finalUrls = url.split("https://");
|
|
28
|
-
const finalUrl = "https://" + finalUrls.pop();
|
|
29
|
-
const response = yield fetch(finalUrl, {
|
|
30
|
-
credentials: "include",
|
|
31
|
-
headers: {
|
|
32
|
-
Accept: "image/*",
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
|
-
if (!response.ok) {
|
|
36
|
-
throw new Error(`HTTP error! status: ${response.status}`);
|
|
37
|
-
}
|
|
38
|
-
const contentType = response.headers.get("content-type");
|
|
39
|
-
if (!(contentType === null || contentType === void 0 ? void 0 : contentType.startsWith("image/"))) {
|
|
40
|
-
throw new Error(`Not an image! content-type: ${contentType}`);
|
|
41
|
-
}
|
|
42
|
-
const buffer = yield response.arrayBuffer();
|
|
43
|
-
const base64 = Buffer.from(buffer).toString("base64");
|
|
44
|
-
return `data:${contentType};base64,${base64}`;
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
console.error(`이미지 변환 실패: ${url}`, error);
|
|
48
|
-
return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
22
|
function generateDesignHTML(data_1) {
|
|
53
23
|
return __awaiter(this, arguments, void 0, function* (data, options = {}) {
|
|
54
24
|
const { size = 600, noSpace = false } = options;
|
|
@@ -251,19 +221,19 @@ function generateDesignHTML(data_1) {
|
|
|
251
221
|
}
|
|
252
222
|
else if (element.src) {
|
|
253
223
|
// 이미지를 base64로 변환
|
|
254
|
-
const base64Image =
|
|
224
|
+
// const base64Image = await convertImageToBase64(element.src);
|
|
255
225
|
html += `<img
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
226
|
+
src="${element.src}"
|
|
227
|
+
alt="Uploaded"
|
|
228
|
+
style="
|
|
229
|
+
width: 100%;
|
|
230
|
+
height: 100%;
|
|
231
|
+
max-width: 100%;
|
|
232
|
+
max-height: 100%;
|
|
233
|
+
object-fit: contain;
|
|
234
|
+
align-self: center;
|
|
235
|
+
"
|
|
236
|
+
/>`;
|
|
267
237
|
}
|
|
268
238
|
html += `</div>`;
|
|
269
239
|
}
|
package/package.json
CHANGED
package/src/browser/index.ts
CHANGED
|
@@ -14,38 +14,6 @@ import {
|
|
|
14
14
|
import Certificates from "../templates/certificates";
|
|
15
15
|
import { portraitComponents } from "../constants/componentsDirection";
|
|
16
16
|
|
|
17
|
-
async function convertImageToBase64(url: string): Promise<string> {
|
|
18
|
-
try {
|
|
19
|
-
// URL이 이미 baseUrl을 포함하고 있는지 확인
|
|
20
|
-
let finalUrls = [];
|
|
21
|
-
finalUrls = url.split("https://");
|
|
22
|
-
const finalUrl = "https://" + finalUrls.pop();
|
|
23
|
-
|
|
24
|
-
const response = await fetch(finalUrl, {
|
|
25
|
-
credentials: "include",
|
|
26
|
-
headers: {
|
|
27
|
-
Accept: "image/*",
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
if (!response.ok) {
|
|
32
|
-
throw new Error(`HTTP error! status: ${response.status}`);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const contentType = response.headers.get("content-type");
|
|
36
|
-
if (!contentType?.startsWith("image/")) {
|
|
37
|
-
throw new Error(`Not an image! content-type: ${contentType}`);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const buffer = await response.arrayBuffer();
|
|
41
|
-
const base64 = Buffer.from(buffer).toString("base64");
|
|
42
|
-
return `data:${contentType};base64,${base64}`;
|
|
43
|
-
} catch (error) {
|
|
44
|
-
console.error(`이미지 변환 실패: ${url}`, error);
|
|
45
|
-
return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
17
|
export async function generateDesignHTML(
|
|
50
18
|
data: IAchievementDesignItem,
|
|
51
19
|
options: DesignOptions = {}
|
|
@@ -283,19 +251,19 @@ export async function generateDesignHTML(
|
|
|
283
251
|
}
|
|
284
252
|
} else if (element.src) {
|
|
285
253
|
// 이미지를 base64로 변환
|
|
286
|
-
const base64Image = await convertImageToBase64(element.src);
|
|
254
|
+
// const base64Image = await convertImageToBase64(element.src);
|
|
287
255
|
html += `<img
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
256
|
+
src="${element.src}"
|
|
257
|
+
alt="Uploaded"
|
|
258
|
+
style="
|
|
259
|
+
width: 100%;
|
|
260
|
+
height: 100%;
|
|
261
|
+
max-width: 100%;
|
|
262
|
+
max-height: 100%;
|
|
263
|
+
object-fit: contain;
|
|
264
|
+
align-self: center;
|
|
265
|
+
"
|
|
266
|
+
/>`;
|
|
299
267
|
}
|
|
300
268
|
html += `</div>`;
|
|
301
269
|
}
|