Skip to content

Commit bc991e9

Browse files
author
Nir Maoz
authored
Feature/support string gravity (#487)
1 parent d0a8d10 commit bc991e9

File tree

4 files changed

+97
-11
lines changed

4 files changed

+97
-11
lines changed

__TESTS_BUNDLE_SIZE__/bundleSizeTestCases.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ const bundleSizeTestCases:ITestCase[] = [
5656
},
5757
{
5858
name: 'Tests Overlay imports',
59-
sizeLimitInKB: 22,
59+
sizeLimitInKB: 23,
6060
importsArray: [
6161
importFromDist('assets/CloudinaryImage', 'CloudinaryImage'),
6262
importFromDist('actions/overlay', 'Overlay'),

__TESTS__/unit/toJson/resize.toJson.test.ts

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import {Transformation} from '../../../src';
22
import {Resize} from "../../../src/actions";
33
import {AspectRatio, Background, GradientDirection} from "../../../src/qualifiers";
44
import {Gravity} from "../../../src/qualifiers";
5-
import {FocusOn} from "../../../src/qualifiers/focusOn";
5+
import {face, FocusOn} from "../../../src/qualifiers/focusOn";
66
import {AutoFocus} from "../../../src/qualifiers/autoFocus";
7+
import {autoGravity} from "../../../src/qualifiers/gravity";
78

89
describe('resize.toJson()', () => {
910
it('scale', () => {
@@ -160,11 +161,33 @@ describe('resize.toJson()', () => {
160161
]);
161162
});
162163

164+
it('should generate auto gravity model', () => {
165+
const transformation = new Transformation()
166+
.addAction(Resize.fill().width(100).height(100).gravity(autoGravity().autoFocus(AutoFocus.focusOn(face())))
167+
);
168+
169+
const model = transformation.toJson();
170+
171+
expect(model).toStrictEqual([
172+
{
173+
actionType: "fill",
174+
dimensions: {width: 100, height: 100},
175+
gravity: {
176+
gravityType: 'auto',
177+
autoFocus: [
178+
{object: "face"}
179+
]
180+
}
181+
}
182+
]);
183+
});
184+
163185
it('should generate auto gravity model', () => {
164186
const transformation = new Transformation()
165187
.addAction(Resize.crop(200).gravity(Gravity.autoGravity().autoFocus(
166188
AutoFocus.focusOn(FocusOn.person()).weight(100),
167-
AutoFocus.focusOn(FocusOn.cat()).weight(50).avoid()
189+
AutoFocus.focusOn(FocusOn.cat()).weight(50).avoid(),
190+
AutoFocus.focusOn(FocusOn.face()).weight(50).avoid()
168191
)));
169192

170193
const model = transformation.toJson();
@@ -177,7 +200,8 @@ describe('resize.toJson()', () => {
177200
gravityType: 'auto',
178201
autoFocus: [
179202
{object: "person", weight: 100},
180-
{object: "cat", avoid: true}
203+
{object: "cat", avoid: true},
204+
{object: "face", avoid: true}
181205
]
182206
}
183207
}
@@ -363,4 +387,36 @@ describe('resize.toJson()', () => {
363387
]);
364388
});
365389

390+
it('should generate gravity model for string', () => {
391+
const transformation = new Transformation()
392+
.addAction(Resize.fill(200).gravity('face'))
393+
.addAction(Resize.fill(200).gravity('auto:face'));
394+
395+
const model = transformation.toJson();
396+
397+
expect(model).toStrictEqual([
398+
{
399+
actionType: "fill",
400+
dimensions: {
401+
width: 200
402+
},
403+
gravity: {
404+
focusOnObjects: ["face"],
405+
gravityType: "object"
406+
}
407+
},
408+
{
409+
actionType: "fill",
410+
dimensions: {
411+
width: 200,
412+
},
413+
gravity: {
414+
gravityType: 'auto',
415+
autoFocus: [
416+
{object: "face"}
417+
]
418+
}
419+
}
420+
]);
421+
});
366422
});

src/internal/models/createGravityModel.ts

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import {AutoGravity} from "../../qualifiers/gravity/autoGravity/AutoGravity.js";
44
import {AutoFocus} from "../../qualifiers/autoFocus.js";
55
import {FocusOnGravity} from "../../qualifiers/gravity/focusOnGravity/FocusOnGravity.js";
66
import {autoGravity} from "../../qualifiers/gravity.js";
7+
import {FocusOnValue} from "../../qualifiers/focusOn.js";
8+
9+
type IAutoGravityString = 'auto' | 'auto:';
710

811
export interface IGravityModel {
912
gravityType: string;
@@ -31,6 +34,14 @@ export interface IFocusOnGravityModel extends IGravityModel {
3134
fallbackGravity?: IAutoGravityModel
3235
}
3336

37+
/**
38+
* true if gravity starts with 'auto' or 'auto:'
39+
* @param gravity
40+
*/
41+
function isIAutoGravityString(gravity: unknown): gravity is IAutoGravityString {
42+
return gravity && `${gravity}`.split(':')[0] === 'auto';
43+
}
44+
3445
/**
3546
* Validate that given val is an ICompassGravity
3647
* @param gravity
@@ -111,9 +122,16 @@ function createIAutoFocusObject(gravity: AutoFocus): IAutoGravityObjectModel {
111122
* Creates an auto gravity model from given AutoGravity
112123
* @param gravity
113124
*/
114-
function createAutoGravityModel(gravity: 'auto' | AutoGravity): IAutoGravityModel {
115-
const gravityQualifier = gravity === 'auto' ? new AutoGravity() : gravity;
116-
const values = gravityQualifier.qualifierValue.values.filter((v) => v !== 'auto');
125+
function createAutoGravityModel(gravity: IAutoGravityString | AutoGravity): IAutoGravityModel {
126+
let values;
127+
const gravityQualifier = gravity === 'auto' ? new AutoGravity() : gravity as AutoGravity;
128+
129+
if (`${gravity}`.startsWith('auto:')) {
130+
values = `${gravity}`.split(':').filter((v) => v !== 'auto');
131+
} else {
132+
values = gravityQualifier.qualifierValue.values.filter((v) => v !== 'auto');
133+
}
134+
117135
const autoFocus = values.map(createIAutoFocusObject);
118136

119137
return {
@@ -138,14 +156,24 @@ function createFocusOnGravityModel(gravity: FocusOnGravity): IFocusOnGravityMode
138156

139157
if (hasAutoGravity) {
140158
// Remove the first 'auto' value by slicing it, because it's added by autoGravity()
141-
const autoFocusObjects = values[values.length -1].values.slice(1);
159+
const autoFocusObjects = values[values.length - 1].values.slice(1);
142160
const autoGravityInstance = autoGravity().autoFocus(...autoFocusObjects);
143161
result.fallbackGravity = createAutoGravityModel(autoGravityInstance);
144162
}
145163

146164
return result;
147165
}
148166

167+
/**
168+
* Creates a FocusOnGravity from given string
169+
* @param gravity
170+
*/
171+
function createFocusOnGravity(gravity: string): FocusOnGravity {
172+
const values = gravity.split(':');
173+
const focusOnValues = values.map((g) => new FocusOnValue(g));
174+
return new FocusOnGravity(focusOnValues);
175+
}
176+
149177
/**
150178
* Create a model of given gravity
151179
* @param gravity
@@ -159,9 +187,11 @@ export function createGravityModel(gravity: IGravity): IGravityModel {
159187
return createOcrGravityModel();
160188
}
161189

162-
if (gravity === 'auto' || isAutoGravity(gravity)){
190+
if (isIAutoGravityString(gravity) || isAutoGravity(gravity)) {
163191
return createAutoGravityModel(gravity);
164192
}
165193

166-
return createFocusOnGravityModel(gravity as FocusOnGravity);
194+
return createFocusOnGravityModel(
195+
typeof gravity === 'string' ? createFocusOnGravity(gravity) : gravity as FocusOnGravity
196+
);
167197
}

src/qualifiers/gravity/GravityQualifier.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {CompassQualifier} from "./qualifiers/compass/CompassQualifier.js";
99
import {XYCenterGravity} from "./xyCenterGravity/XYCenterGravity.js";
1010

1111
export type IGravityString = 'auto' | ICompassGravity;
12-
export type IGravity = CompassGravity | AutoGravity | FocusOnGravity | XYCenterGravity | IGravityString;
12+
export type IGravity = CompassGravity | AutoGravity | FocusOnGravity | XYCenterGravity | IGravityString | string;
1313
export type IGravityValue = CompassQualifier | FocusOnValue | AutoFocus;
1414

1515
/**

0 commit comments

Comments
 (0)