@pdfme/common 1.2.6 → 2.0.1

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.
Files changed (42) hide show
  1. package/dist/cjs/__tests__/font.test.js +254 -0
  2. package/dist/cjs/__tests__/font.test.js.map +1 -0
  3. package/dist/cjs/__tests__/helper.test.js +0 -189
  4. package/dist/cjs/__tests__/helper.test.js.map +1 -1
  5. package/dist/cjs/src/constants.js +2 -1
  6. package/dist/cjs/src/constants.js.map +1 -1
  7. package/dist/cjs/src/{calculateDynamicFontSize.js → font.js} +76 -7
  8. package/dist/cjs/src/font.js.map +1 -0
  9. package/dist/cjs/src/helper.js +11 -52
  10. package/dist/cjs/src/helper.js.map +1 -1
  11. package/dist/cjs/src/index.js +10 -6
  12. package/dist/cjs/src/index.js.map +1 -1
  13. package/dist/esm/__tests__/font.test.js +229 -0
  14. package/dist/esm/__tests__/font.test.js.map +1 -0
  15. package/dist/esm/__tests__/helper.test.js +1 -167
  16. package/dist/esm/__tests__/helper.test.js.map +1 -1
  17. package/dist/esm/src/constants.js +1 -0
  18. package/dist/esm/src/constants.js.map +1 -1
  19. package/dist/esm/src/{calculateDynamicFontSize.js → font.js} +70 -7
  20. package/dist/esm/src/font.js.map +1 -0
  21. package/dist/esm/src/helper.js +2 -40
  22. package/dist/esm/src/helper.js.map +1 -1
  23. package/dist/esm/src/index.js +4 -4
  24. package/dist/esm/src/index.js.map +1 -1
  25. package/dist/types/src/constants.d.ts +1 -0
  26. package/dist/types/src/font.d.ts +17 -0
  27. package/dist/types/src/helper.d.ts +1 -7
  28. package/dist/types/src/index.d.ts +4 -4
  29. package/package.json +2 -2
  30. package/src/constants.ts +1 -0
  31. package/src/font.ts +194 -0
  32. package/src/helper.ts +3 -58
  33. package/src/index.ts +13 -4
  34. package/dist/cjs/__tests__/calculateDynamicFontSize.test.js +0 -97
  35. package/dist/cjs/__tests__/calculateDynamicFontSize.test.js.map +0 -1
  36. package/dist/cjs/src/calculateDynamicFontSize.js.map +0 -1
  37. package/dist/esm/__tests__/calculateDynamicFontSize.test.js +0 -72
  38. package/dist/esm/__tests__/calculateDynamicFontSize.test.js.map +0 -1
  39. package/dist/esm/src/calculateDynamicFontSize.js.map +0 -1
  40. package/dist/types/src/calculateDynamicFontSize.d.ts +0 -6
  41. package/src/calculateDynamicFontSize.ts +0 -101
  42. /package/dist/types/__tests__/{calculateDynamicFontSize.test.d.ts → font.test.d.ts} +0 -0
package/src/font.ts ADDED
@@ -0,0 +1,194 @@
1
+ import * as fontkit from 'fontkit';
2
+ import type { Font as FontKitFont } from 'fontkit';
3
+ import { Template, Schema, Font, isTextSchema, TextSchema } from './type';
4
+ import { Buffer } from 'buffer';
5
+ import {
6
+ DEFAULT_FONT_VALUE,
7
+ DEFAULT_FONT_NAME,
8
+ DEFAULT_FONT_SIZE,
9
+ DEFAULT_CHARACTER_SPACING,
10
+ DEFAULT_TOLERANCE,
11
+ DEFAULT_FONT_SIZE_ADJUSTMENT,
12
+ DEFAULT_PT_TO_MM_RATIO,
13
+ DEFAULT_PT_TO_PX_RATIO,
14
+ } from './constants';
15
+ import { b64toUint8Array } from "."
16
+
17
+ export const getFallbackFontName = (font: Font) => {
18
+ const initial = '';
19
+ const fallbackFontName = Object.entries(font).reduce((acc, cur) => {
20
+ const [fontName, fontValue] = cur;
21
+
22
+ return !acc && fontValue.fallback ? fontName : acc;
23
+ }, initial);
24
+ if (fallbackFontName === initial) {
25
+ throw Error(`fallback flag is not found in font. true fallback flag must be only one.`);
26
+ }
27
+
28
+ return fallbackFontName;
29
+ };
30
+
31
+ const getFallbackFont = (font: Font) => {
32
+ const fallbackFontName = getFallbackFontName(font);
33
+ return font[fallbackFontName];
34
+ }
35
+
36
+ export const getDefaultFont = (): Font => ({
37
+ [DEFAULT_FONT_NAME]: { data: b64toUint8Array(DEFAULT_FONT_VALUE), fallback: true },
38
+ });
39
+
40
+ const uniq = <T>(array: Array<T>) => Array.from(new Set(array));
41
+
42
+ const getFontNamesInSchemas = (schemas: { [key: string]: Schema }[]) =>
43
+ uniq(
44
+ schemas
45
+ .map((s) => Object.values(s).map((v) => (isTextSchema(v) ? v.fontName : '')))
46
+ .reduce((acc, cur) => acc.concat(cur), [] as (string | undefined)[])
47
+ .filter(Boolean) as string[]
48
+ );
49
+
50
+ export const checkFont = (arg: { font: Font; template: Template }) => {
51
+ const {
52
+ font,
53
+ template: { schemas },
54
+ } = arg;
55
+ const fontValues = Object.values(font);
56
+ const fallbackFontNum = fontValues.reduce((acc, cur) => (cur.fallback ? acc + 1 : acc), 0);
57
+ if (fallbackFontNum === 0) {
58
+ throw Error(`fallback flag is not found in font. true fallback flag must be only one.`);
59
+ }
60
+ if (fallbackFontNum > 1) {
61
+ throw Error(
62
+ `${fallbackFontNum} fallback flags found in font. true fallback flag must be only one.`
63
+ );
64
+ }
65
+
66
+ const fontNamesInSchemas = getFontNamesInSchemas(schemas);
67
+ const fontNames = Object.keys(font);
68
+ if (fontNamesInSchemas.some((f) => !fontNames.includes(f))) {
69
+ throw Error(
70
+ `${fontNamesInSchemas
71
+ .filter((f) => !fontNames.includes(f))
72
+ .join()} of template.schemas is not found in font.`
73
+ );
74
+ }
75
+ };
76
+
77
+ export const getFontAlignmentValue = (fontKitFont: FontKitFont, fontSize: number) => {
78
+ const { ascent, descent, unitsPerEm } = fontKitFont;
79
+
80
+ const fontSizeInPx = fontSize * DEFAULT_PT_TO_PX_RATIO;
81
+
82
+ // Convert ascent and descent to px values
83
+ const ascentInPixels = (ascent / unitsPerEm) * fontSizeInPx;
84
+ const descentInPixels = (descent / unitsPerEm) * fontSizeInPx;
85
+
86
+ // Calculate the single line height in px
87
+ const singleLineHeight = ((ascentInPixels + Math.abs(descentInPixels)) / fontSizeInPx);
88
+
89
+ // Calculate the top margin/padding in px
90
+ return ((singleLineHeight * fontSizeInPx) - fontSizeInPx) / 2
91
+ }
92
+
93
+ export const heightOfFontAtSize = (fontKitFont: FontKitFont, fontSize: number) => {
94
+ const { ascent, descent, bbox, unitsPerEm } = fontKitFont;
95
+
96
+ const scale = 1000 / unitsPerEm;
97
+ const yTop = (ascent || bbox.maxY) * scale;
98
+ const yBottom = (descent || bbox.minY) * scale;
99
+
100
+ let height = yTop - yBottom;
101
+ height -= Math.abs(descent * scale) || 0;
102
+
103
+ return (height / 1000) * fontSize;
104
+ };
105
+
106
+ const widthOfTextAtSize = (input: string, fontKitFont: FontKitFont, fontSize: number) => {
107
+ const { glyphs } = fontKitFont.layout(input);
108
+ const scale = 1000 / fontKitFont.unitsPerEm;
109
+ return glyphs.reduce((totalWidth, glyph) => totalWidth + glyph.advanceWidth * scale, 0) * (fontSize / 1000);
110
+ }
111
+
112
+ const calculateCharacterSpacing = (
113
+ textContent: string,
114
+ textCharacterSpacing: number
115
+ ) => {
116
+ const numberOfCharacters = textContent.length;
117
+ return (numberOfCharacters - 1) * textCharacterSpacing;
118
+ };
119
+
120
+ const calculateTextWidthInMm = (textContent: string, textWidth: number, textCharacterSpacing: number) =>
121
+ (textWidth + calculateCharacterSpacing(textContent, textCharacterSpacing)) * DEFAULT_PT_TO_MM_RATIO;
122
+
123
+ const getLongestLine = (
124
+ textContentRows: string[],
125
+ fontKitFont: FontKitFont,
126
+ fontSize: number,
127
+ characterSpacingCount: number
128
+ ) => {
129
+ let longestLine = '';
130
+ let maxLineWidth = 0;
131
+
132
+ textContentRows.forEach((line) => {
133
+ const textWidth = widthOfTextAtSize(line, fontKitFont, fontSize);
134
+ const lineWidth = calculateTextWidthInMm(line, textWidth, characterSpacingCount);
135
+
136
+ if (lineWidth > maxLineWidth) {
137
+ longestLine = line;
138
+ maxLineWidth = lineWidth;
139
+ }
140
+ });
141
+
142
+ return longestLine;
143
+ };
144
+
145
+
146
+ const fontKitFontCache: { [fontName: string]: FontKitFont } = {};
147
+ export const getFontKitFont = async (textSchema: TextSchema, font: Font) => {
148
+ const fontName = textSchema.fontName || getFallbackFontName(font);
149
+ if (fontKitFontCache[fontName]) {
150
+ return fontKitFontCache[fontName];
151
+ }
152
+
153
+ const currentFont = font[fontName] || getFallbackFont(font) || getDefaultFont()[DEFAULT_FONT_NAME];
154
+ let fontData = currentFont.data;
155
+ if (typeof fontData === 'string') {
156
+ fontData = fontData.startsWith('http') ? await fetch(fontData).then((res) => res.arrayBuffer()) : b64toUint8Array(fontData);
157
+ }
158
+
159
+ const fontKitFont = fontkit.create(fontData instanceof Buffer ? fontData : Buffer.from(fontData as ArrayBuffer));
160
+ fontKitFontCache[fontName] = fontKitFont
161
+
162
+ return fontKitFont;
163
+ }
164
+
165
+ const getTextContent = (input: string, fontKitFont: FontKitFont, fontSize: number, characterSpacingCount: number): string => {
166
+ const textContentRows = input.split('\n');
167
+ return textContentRows.length > 1 ? getLongestLine(textContentRows, fontKitFont, fontSize, characterSpacingCount) : input;
168
+ }
169
+
170
+ export const calculateDynamicFontSize = async ({ textSchema, font, input }: { textSchema: TextSchema, font: Font, input: string }) => {
171
+ const { fontSize: _fontSize, dynamicFontSize: dynamicFontSizeSetting, characterSpacing, width } = textSchema;
172
+ const fontSize = _fontSize || DEFAULT_FONT_SIZE;
173
+ if (!dynamicFontSizeSetting) return fontSize;
174
+
175
+ const characterSpacingCount = characterSpacing ?? DEFAULT_CHARACTER_SPACING;
176
+ const fontKitFont = await getFontKitFont(textSchema, font);
177
+ const textContent = getTextContent(input, fontKitFont, fontSize, characterSpacingCount);
178
+ const textWidth = widthOfTextAtSize(textContent, fontKitFont, fontSize);
179
+
180
+ let dynamicFontSize = fontSize;
181
+ let textWidthInMm = calculateTextWidthInMm(textContent, textWidth, characterSpacingCount);
182
+
183
+ while (textWidthInMm > width - DEFAULT_TOLERANCE && dynamicFontSize > dynamicFontSizeSetting.min) {
184
+ dynamicFontSize -= DEFAULT_FONT_SIZE_ADJUSTMENT;
185
+ textWidthInMm = calculateTextWidthInMm(textContent, widthOfTextAtSize(textContent, fontKitFont, dynamicFontSize), characterSpacingCount);
186
+ }
187
+
188
+ while (textWidthInMm < width - DEFAULT_TOLERANCE && dynamicFontSize < dynamicFontSizeSetting.max) {
189
+ dynamicFontSize += DEFAULT_FONT_SIZE_ADJUSTMENT;
190
+ textWidthInMm = calculateTextWidthInMm(textContent, widthOfTextAtSize(textContent, fontKitFont, dynamicFontSize), characterSpacingCount);
191
+ }
192
+
193
+ return dynamicFontSize;
194
+ };
package/src/helper.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { Buffer } from 'buffer';
3
- import { DEFAULT_FONT_NAME, DEFAULT_FONT_VALUE } from './constants.js';
4
- import { Template, Schema, BasePdf, Font, CommonProps, isTextSchema, BarCodeType } from './type.js';
3
+ import { BasePdf, CommonProps, BarCodeType, } from './type';
5
4
  import {
6
5
  Inputs as InputsSchema,
7
6
  UIOptions as UIOptionsSchema,
@@ -10,7 +9,8 @@ import {
10
9
  DesignerProps as DesignerPropsSchema,
11
10
  GenerateProps as GeneratePropsSchema,
12
11
  UIProps as UIPropsSchema,
13
- } from './schema.js';
12
+ } from './schema';
13
+ import { checkFont } from "./font"
14
14
 
15
15
  const blob2Base64Pdf = (blob: Blob) => {
16
16
  return new Promise<string>((resolve, reject) => {
@@ -55,61 +55,6 @@ export const b64toUint8Array = (base64: string) => {
55
55
  return unit8arr;
56
56
  };
57
57
 
58
- export const getFallbackFontName = (font: Font) => {
59
- const initial = '';
60
- const fallbackFontName = Object.entries(font).reduce((acc, cur) => {
61
- const [fontName, fontValue] = cur;
62
-
63
- return !acc && fontValue.fallback ? fontName : acc;
64
- }, initial);
65
- if (fallbackFontName === initial) {
66
- throw Error(`fallback flag is not found in font. true fallback flag must be only one.`);
67
- }
68
-
69
- return fallbackFontName;
70
- };
71
-
72
- export const getDefaultFont = (): Font => ({
73
- [DEFAULT_FONT_NAME]: { data: b64toUint8Array(DEFAULT_FONT_VALUE), fallback: true },
74
- });
75
-
76
- const uniq = <T>(array: Array<T>) => Array.from(new Set(array));
77
-
78
- const getFontNamesInSchemas = (schemas: { [key: string]: Schema }[]) =>
79
- uniq(
80
- schemas
81
- .map((s) => Object.values(s).map((v) => (isTextSchema(v) ? v.fontName : '')))
82
- .reduce((acc, cur) => acc.concat(cur), [] as (string | undefined)[])
83
- .filter(Boolean) as string[]
84
- );
85
-
86
- export const checkFont = (arg: { font: Font; template: Template }) => {
87
- const {
88
- font,
89
- template: { schemas },
90
- } = arg;
91
- const fontValues = Object.values(font);
92
- const fallbackFontNum = fontValues.reduce((acc, cur) => (cur.fallback ? acc + 1 : acc), 0);
93
- if (fallbackFontNum === 0) {
94
- throw Error(`fallback flag is not found in font. true fallback flag must be only one.`);
95
- }
96
- if (fallbackFontNum > 1) {
97
- throw Error(
98
- `${fallbackFontNum} fallback flags found in font. true fallback flag must be only one.`
99
- );
100
- }
101
-
102
- const fontNamesInSchemas = getFontNamesInSchemas(schemas);
103
- const fontNames = Object.keys(font);
104
- if (fontNamesInSchemas.some((f) => !fontNames.includes(f))) {
105
- throw Error(
106
- `${fontNamesInSchemas
107
- .filter((f) => !fontNames.includes(f))
108
- .join()} of template.schemas is not found in font.`
109
- );
110
- }
111
- };
112
-
113
58
  const checkProps = <T>(data: unknown, zodSchema: z.ZodType<T>) => {
114
59
  try {
115
60
  zodSchema.parse(data);
package/src/index.ts CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  DEFAULT_TOLERANCE,
9
9
  DEFAULT_FONT_SIZE_ADJUSTMENT,
10
10
  DEFAULT_PT_TO_MM_RATIO,
11
+ DEFAULT_PT_TO_PX_RATIO,
11
12
  BLANK_PDF,
12
13
  DEFAULT_FONT_VALUE,
13
14
  } from './constants.js';
@@ -40,9 +41,6 @@ import type {
40
41
  import {
41
42
  getB64BasePdf,
42
43
  b64toUint8Array,
43
- getFallbackFontName,
44
- getDefaultFont,
45
- checkFont,
46
44
  checkInputs,
47
45
  checkUIOptions,
48
46
  checkTemplate,
@@ -52,7 +50,14 @@ import {
52
50
  checkGenerateProps,
53
51
  validateBarcodeInput,
54
52
  } from './helper.js';
55
- import { calculateDynamicFontSize } from './calculateDynamicFontSize.js';
53
+ import {
54
+ calculateDynamicFontSize, getFallbackFontName,
55
+ getDefaultFont,
56
+ heightOfFontAtSize,
57
+ checkFont,
58
+ getFontKitFont,
59
+ getFontAlignmentValue,
60
+ } from './font.js';
56
61
 
57
62
  export {
58
63
  DEFAULT_FONT_NAME,
@@ -64,6 +69,7 @@ export {
64
69
  DEFAULT_TOLERANCE,
65
70
  DEFAULT_FONT_SIZE_ADJUSTMENT,
66
71
  DEFAULT_PT_TO_MM_RATIO,
72
+ DEFAULT_PT_TO_PX_RATIO,
67
73
  BLANK_PDF,
68
74
  DEFAULT_FONT_VALUE,
69
75
  schemaTypes,
@@ -74,7 +80,10 @@ export {
74
80
  b64toUint8Array,
75
81
  getFallbackFontName,
76
82
  getDefaultFont,
83
+ heightOfFontAtSize,
77
84
  checkFont,
85
+ getFontKitFont,
86
+ getFontAlignmentValue,
78
87
  checkInputs,
79
88
  checkUIOptions,
80
89
  checkTemplate,
@@ -1,97 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
- return new (P || (P = Promise))(function (resolve, reject) {
28
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next());
32
- });
33
- };
34
- Object.defineProperty(exports, "__esModule", { value: true });
35
- const fs_1 = require("fs");
36
- const path = __importStar(require("path"));
37
- const calculateDynamicFontSize_1 = require("../src/calculateDynamicFontSize");
38
- const helper_1 = require("../src/helper");
39
- const sansData = (0, fs_1.readFileSync)(path.join(__dirname, `/assets/fonts/SauceHanSansJP.ttf`));
40
- const serifData = (0, fs_1.readFileSync)(path.join(__dirname, `/assets/fonts/SauceHanSerifJP.ttf`));
41
- const getSampleFont = () => ({
42
- SauceHanSansJP: { fallback: true, data: sansData },
43
- SauceHanSerifJP: { data: serifData },
44
- });
45
- const getTextSchema = () => {
46
- const textSchema = {
47
- position: { x: 0, y: 0 }, type: 'text', fontSize: 14, characterSpacing: 1, width: 50, height: 50
48
- };
49
- return textSchema;
50
- };
51
- describe('calculateDynamicFontSize with Default font', () => {
52
- const font = (0, helper_1.getDefaultFont)();
53
- it('should return default font size when dynamicFontSizeSetting is not provided', () => __awaiter(void 0, void 0, void 0, function* () {
54
- const textSchema = getTextSchema();
55
- const result = yield (0, calculateDynamicFontSize_1.calculateDynamicFontSize)({ textSchema, font, input: 'test' });
56
- expect(result).toBe(14);
57
- }));
58
- it('should return smaller font size when dynamicFontSizeSetting is provided', () => __awaiter(void 0, void 0, void 0, function* () {
59
- const textSchema = Object.assign(getTextSchema(), { dynamicFontSize: { max: 20, min: 10 } });
60
- const result = yield (0, calculateDynamicFontSize_1.calculateDynamicFontSize)({ textSchema, font, input: 'testtesttesttesttest' });
61
- expect(result).toBe(14.25);
62
- }));
63
- it('should return min font size when dynamicFontSizeSetting and long text are provided', () => __awaiter(void 0, void 0, void 0, function* () {
64
- const textSchema = Object.assign(getTextSchema(), { dynamicFontSize: { max: 20, min: 10 } });
65
- const result = yield (0, calculateDynamicFontSize_1.calculateDynamicFontSize)({ textSchema, font, input: 'testtesttesttesttesttesttesttesttesttesttest' });
66
- expect(result).toBe(10);
67
- }));
68
- it('should return max font size when dynamicFontSizeSetting and short text are provided', () => __awaiter(void 0, void 0, void 0, function* () {
69
- const textSchema = Object.assign(getTextSchema(), { dynamicFontSize: { max: 20, min: 10 } });
70
- const result = yield (0, calculateDynamicFontSize_1.calculateDynamicFontSize)({ textSchema, font, input: 'a' });
71
- expect(result).toBe(20);
72
- }));
73
- });
74
- describe('calculateDynamicFontSize with Custom font', () => {
75
- const font = getSampleFont();
76
- it('should return default font size when dynamicFontSizeSetting is not provided', () => __awaiter(void 0, void 0, void 0, function* () {
77
- const textSchema = getTextSchema();
78
- const result = yield (0, calculateDynamicFontSize_1.calculateDynamicFontSize)({ textSchema, font, input: 'あいう' });
79
- expect(result).toBe(14);
80
- }));
81
- it('should return smaller font size when dynamicFontSizeSetting is provided', () => __awaiter(void 0, void 0, void 0, function* () {
82
- const textSchema = Object.assign(getTextSchema(), { dynamicFontSize: { max: 20, min: 10 } });
83
- const result = yield (0, calculateDynamicFontSize_1.calculateDynamicFontSize)({ textSchema, font, input: 'あいうあいうあいうあいうあいうあいう' });
84
- expect(result).toBe(15.5);
85
- }));
86
- it('should return min font size when dynamicFontSizeSetting and long text are provided', () => __awaiter(void 0, void 0, void 0, function* () {
87
- const textSchema = Object.assign(getTextSchema(), { dynamicFontSize: { max: 20, min: 10 } });
88
- const result = yield (0, calculateDynamicFontSize_1.calculateDynamicFontSize)({ textSchema, font, input: 'あいうあいうあいうあいうあいうあいうあいうあいうあいう' });
89
- expect(result).toBe(10);
90
- }));
91
- it('should return max font size when dynamicFontSizeSetting and short text are provided', () => __awaiter(void 0, void 0, void 0, function* () {
92
- const textSchema = Object.assign(getTextSchema(), { dynamicFontSize: { max: 20, min: 10 } });
93
- const result = yield (0, calculateDynamicFontSize_1.calculateDynamicFontSize)({ textSchema, font, input: 'あ' });
94
- expect(result).toBe(20);
95
- }));
96
- });
97
- //# sourceMappingURL=calculateDynamicFontSize.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calculateDynamicFontSize.test.js","sourceRoot":"","sources":["../../../__tests__/calculateDynamicFontSize.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"calculateDynamicFontSize.js","sourceRoot":"","sources":["../../../src/calculateDynamicFontSize.ts"],"names":[],"mappings":"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"}
@@ -1,72 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { readFileSync } from 'fs';
11
- import * as path from 'path';
12
- import { calculateDynamicFontSize } from "../src/calculateDynamicFontSize";
13
- import { getDefaultFont } from "../src/helper";
14
- const sansData = readFileSync(path.join(__dirname, `/assets/fonts/SauceHanSansJP.ttf`));
15
- const serifData = readFileSync(path.join(__dirname, `/assets/fonts/SauceHanSerifJP.ttf`));
16
- const getSampleFont = () => ({
17
- SauceHanSansJP: { fallback: true, data: sansData },
18
- SauceHanSerifJP: { data: serifData },
19
- });
20
- const getTextSchema = () => {
21
- const textSchema = {
22
- position: { x: 0, y: 0 }, type: 'text', fontSize: 14, characterSpacing: 1, width: 50, height: 50
23
- };
24
- return textSchema;
25
- };
26
- describe('calculateDynamicFontSize with Default font', () => {
27
- const font = getDefaultFont();
28
- it('should return default font size when dynamicFontSizeSetting is not provided', () => __awaiter(void 0, void 0, void 0, function* () {
29
- const textSchema = getTextSchema();
30
- const result = yield calculateDynamicFontSize({ textSchema, font, input: 'test' });
31
- expect(result).toBe(14);
32
- }));
33
- it('should return smaller font size when dynamicFontSizeSetting is provided', () => __awaiter(void 0, void 0, void 0, function* () {
34
- const textSchema = Object.assign(getTextSchema(), { dynamicFontSize: { max: 20, min: 10 } });
35
- const result = yield calculateDynamicFontSize({ textSchema, font, input: 'testtesttesttesttest' });
36
- expect(result).toBe(14.25);
37
- }));
38
- it('should return min font size when dynamicFontSizeSetting and long text are provided', () => __awaiter(void 0, void 0, void 0, function* () {
39
- const textSchema = Object.assign(getTextSchema(), { dynamicFontSize: { max: 20, min: 10 } });
40
- const result = yield calculateDynamicFontSize({ textSchema, font, input: 'testtesttesttesttesttesttesttesttesttesttest' });
41
- expect(result).toBe(10);
42
- }));
43
- it('should return max font size when dynamicFontSizeSetting and short text are provided', () => __awaiter(void 0, void 0, void 0, function* () {
44
- const textSchema = Object.assign(getTextSchema(), { dynamicFontSize: { max: 20, min: 10 } });
45
- const result = yield calculateDynamicFontSize({ textSchema, font, input: 'a' });
46
- expect(result).toBe(20);
47
- }));
48
- });
49
- describe('calculateDynamicFontSize with Custom font', () => {
50
- const font = getSampleFont();
51
- it('should return default font size when dynamicFontSizeSetting is not provided', () => __awaiter(void 0, void 0, void 0, function* () {
52
- const textSchema = getTextSchema();
53
- const result = yield calculateDynamicFontSize({ textSchema, font, input: 'あいう' });
54
- expect(result).toBe(14);
55
- }));
56
- it('should return smaller font size when dynamicFontSizeSetting is provided', () => __awaiter(void 0, void 0, void 0, function* () {
57
- const textSchema = Object.assign(getTextSchema(), { dynamicFontSize: { max: 20, min: 10 } });
58
- const result = yield calculateDynamicFontSize({ textSchema, font, input: 'あいうあいうあいうあいうあいうあいう' });
59
- expect(result).toBe(15.5);
60
- }));
61
- it('should return min font size when dynamicFontSizeSetting and long text are provided', () => __awaiter(void 0, void 0, void 0, function* () {
62
- const textSchema = Object.assign(getTextSchema(), { dynamicFontSize: { max: 20, min: 10 } });
63
- const result = yield calculateDynamicFontSize({ textSchema, font, input: 'あいうあいうあいうあいうあいうあいうあいうあいうあいう' });
64
- expect(result).toBe(10);
65
- }));
66
- it('should return max font size when dynamicFontSizeSetting and short text are provided', () => __awaiter(void 0, void 0, void 0, function* () {
67
- const textSchema = Object.assign(getTextSchema(), { dynamicFontSize: { max: 20, min: 10 } });
68
- const result = yield calculateDynamicFontSize({ textSchema, font, input: 'あ' });
69
- expect(result).toBe(20);
70
- }));
71
- });
72
- //# sourceMappingURL=calculateDynamicFontSize.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calculateDynamicFontSize.test.js","sourceRoot":"","sources":["../../../__tests__/calculateDynamicFontSize.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"calculateDynamicFontSize.js","sourceRoot":"","sources":["../../../src/calculateDynamicFontSize.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import { TextSchema, Font } from './type';
2
- export declare const calculateDynamicFontSize: ({ textSchema, font, input }: {
3
- textSchema: TextSchema;
4
- font: Font;
5
- input: string;
6
- }) => Promise<number>;
@@ -1,101 +0,0 @@
1
- import * as fontkit from 'fontkit';
2
- import { TextSchema, Font } from './type';
3
- import { Buffer } from 'buffer';
4
- import {
5
- DEFAULT_FONT_VALUE,
6
- DEFAULT_FONT_NAME,
7
- DEFAULT_FONT_SIZE,
8
- DEFAULT_CHARACTER_SPACING,
9
- DEFAULT_TOLERANCE,
10
- DEFAULT_FONT_SIZE_ADJUSTMENT,
11
- DEFAULT_PT_TO_MM_RATIO
12
- } from './constants';
13
- import { b64toUint8Array } from "."
14
-
15
- const widthOfTextAtSize = (input: string, fontKitFont: fontkit.Font, fontSize: number) => {
16
- const { glyphs } = fontKitFont.layout(input);
17
- const scale = 1000 / fontKitFont.unitsPerEm;
18
- return glyphs.reduce((totalWidth, glyph) => totalWidth + glyph.advanceWidth * scale, 0) * (fontSize / 1000);
19
- }
20
-
21
- const calculateCharacterSpacing = (
22
- textContent: string,
23
- textCharacterSpacing: number
24
- ) => {
25
- const numberOfCharacters = textContent.length;
26
- return (numberOfCharacters - 1) * textCharacterSpacing;
27
- };
28
-
29
- const calculateTextWidthInMm = (textContent: string, textWidth: number, textCharacterSpacing: number) =>
30
- (textWidth + calculateCharacterSpacing(textContent, textCharacterSpacing)) * DEFAULT_PT_TO_MM_RATIO;
31
-
32
- const getLongestLine = (
33
- textContentRows: string[],
34
- fontKitFont: fontkit.Font,
35
- fontSize: number,
36
- characterSpacingCount: number
37
- ) => {
38
- let longestLine = '';
39
- let maxLineWidth = 0;
40
-
41
- textContentRows.forEach((line) => {
42
- const textWidth = widthOfTextAtSize(line, fontKitFont, fontSize);
43
- const lineWidth = calculateTextWidthInMm(line, textWidth, characterSpacingCount);
44
-
45
- if (lineWidth > maxLineWidth) {
46
- longestLine = line;
47
- maxLineWidth = lineWidth;
48
- }
49
- });
50
-
51
- return longestLine;
52
- };
53
-
54
-
55
- const fontKitFontCache: { [fontName: string]: fontkit.Font } = {};
56
- const createFontKitFont = async (font: Font, fontName: string = DEFAULT_FONT_NAME) => {
57
- if (fontKitFontCache[fontName]) {
58
- return fontKitFontCache[fontName];
59
- }
60
-
61
- let fontData = font[fontName]?.data || DEFAULT_FONT_VALUE;
62
- if (typeof fontData === 'string') {
63
- fontData = fontData.startsWith('http') ? await fetch(fontData).then((res) => res.arrayBuffer()) : b64toUint8Array(fontData);
64
- }
65
-
66
- const fontKitFont = fontkit.create(fontData instanceof Buffer ? fontData : Buffer.from(fontData as string));
67
- fontKitFontCache[fontName] = fontKitFont
68
-
69
- return fontKitFont;
70
- }
71
-
72
- const getTextContent = (input: string, fontKitFont: fontkit.Font, fontSize: number, characterSpacingCount: number): string => {
73
- const textContentRows = input.split('\n');
74
- return textContentRows.length > 1 ? getLongestLine(textContentRows, fontKitFont, fontSize, characterSpacingCount) : input;
75
- }
76
-
77
- export const calculateDynamicFontSize = async ({ textSchema, font, input }: { textSchema: TextSchema, font: Font, input: string }) => {
78
- const { fontName, fontSize: _fontSize, dynamicFontSize: dynamicFontSizeSetting, characterSpacing, width } = textSchema;
79
- const fontSize = _fontSize || DEFAULT_FONT_SIZE;
80
- if (!dynamicFontSizeSetting) return fontSize;
81
-
82
- const characterSpacingCount = characterSpacing ?? DEFAULT_CHARACTER_SPACING;
83
- const fontKitFont = await createFontKitFont(font, fontName);
84
- const textContent = getTextContent(input, fontKitFont, fontSize, characterSpacingCount);
85
- const textWidth = widthOfTextAtSize(textContent, fontKitFont, fontSize);
86
-
87
- let dynamicFontSize = fontSize;
88
- let textWidthInMm = calculateTextWidthInMm(textContent, textWidth, characterSpacingCount);
89
-
90
- while (textWidthInMm > width - DEFAULT_TOLERANCE && dynamicFontSize > dynamicFontSizeSetting.min) {
91
- dynamicFontSize -= DEFAULT_FONT_SIZE_ADJUSTMENT;
92
- textWidthInMm = calculateTextWidthInMm(textContent, widthOfTextAtSize(textContent, fontKitFont, dynamicFontSize), characterSpacingCount);
93
- }
94
-
95
- while (textWidthInMm < width - DEFAULT_TOLERANCE && dynamicFontSize < dynamicFontSizeSetting.max) {
96
- dynamicFontSize += DEFAULT_FONT_SIZE_ADJUSTMENT;
97
- textWidthInMm = calculateTextWidthInMm(textContent, widthOfTextAtSize(textContent, fontKitFont, dynamicFontSize), characterSpacingCount);
98
- }
99
-
100
- return dynamicFontSize;
101
- };