Skip to content

Commit b3adb3e

Browse files
author
Nir Maoz
authored
Add ocr gravity model (#477)
1 parent e1faa21 commit b3adb3e

File tree

9 files changed

+112
-34
lines changed

9 files changed

+112
-34
lines changed

__TESTS_BUNDLE_SIZE__/bundleSizeTestCases.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import importFromPackage from "./utils/stringGenerators/importFromPackage";
1515
const bundleSizeTestCases:ITestCase[] = [
1616
{
1717
name: 'Tests CloudinaryImage with Resize',
18-
sizeLimitInKB: 19,
18+
sizeLimitInKB: 20,
1919
importsArray: [
2020
importFromDist('assets/CloudinaryImage', 'CloudinaryImage'),
2121
importFromDist('instance/Cloudinary', 'Cloudinary'),
@@ -24,7 +24,7 @@ const bundleSizeTestCases:ITestCase[] = [
2424
},
2525
{
2626
name: 'Tests CloudinaryImage with Resize and Adjust',
27-
sizeLimitInKB: 23,
27+
sizeLimitInKB: 24,
2828
importsArray: [
2929
importFromDist('assets/CloudinaryImage', 'CloudinaryImage'),
3030
importFromDist('instance/Cloudinary', 'Cloudinary'),
@@ -34,7 +34,7 @@ const bundleSizeTestCases:ITestCase[] = [
3434
},
3535
{
3636
name: 'Tests CloudinaryImage with Resize, Adjust and Border',
37-
sizeLimitInKB: 23,
37+
sizeLimitInKB: 24,
3838
importsArray: [
3939
importFromDist('assets/CloudinaryImage', 'CloudinaryImage'),
4040
importFromDist('instance/Cloudinary', 'Cloudinary'),
@@ -45,7 +45,7 @@ const bundleSizeTestCases:ITestCase[] = [
4545
},
4646
{
4747
name: 'Tests CloudinaryImage image with Resize, adjust and delivery',
48-
sizeLimitInKB: 24,
48+
sizeLimitInKB: 25,
4949
importsArray: [
5050
importFromDist('assets/CloudinaryImage', 'CloudinaryImage'),
5151
importFromDist('instance/Cloudinary', 'Cloudinary'),
@@ -56,7 +56,7 @@ const bundleSizeTestCases:ITestCase[] = [
5656
},
5757
{
5858
name: 'Tests Overlay imports',
59-
sizeLimitInKB: 20,
59+
sizeLimitInKB: 21,
6060
importsArray: [
6161
importFromDist('assets/CloudinaryImage', 'CloudinaryImage'),
6262
importFromDist('actions/overlay', 'Overlay'),
@@ -88,7 +88,7 @@ const bundleSizeTestCases:ITestCase[] = [
8888
},
8989
{
9090
name: 'Import All Actions',
91-
sizeLimitInKB: 33,
91+
sizeLimitInKB: 34,
9292
importsArray: [
9393
importFromPackage('Actions')
9494
]

__TESTS__/unit/fromJson/resize.fromJson.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ describe('resize.fromJson', () => {
77
{actionType: 'fit', dimensions: {height: 200, aspectRatio: '16:9'}, relative: true},
88
{actionType: 'limitFit', dimensions: {height: 200, aspectRatio: 'ignore_aspect_ratio'}, relative: true},
99
{actionType: 'minimumFit', dimensions: {width: 100}, regionRelative: true},
10-
{actionType: 'crop', dimensions: {width: 100}, regionRelative: true, gravity: 'north_east', y: 3, zoom: 7},
11-
{actionType: 'fill', dimensions: {width: 100}, relative: true, gravity: 'south', x: 4, y: 5},
12-
{actionType: 'limitFill', dimensions: {width: 100}, relative: true, gravity: 'south', x: 4, y: 5},
13-
{actionType: 'thumbnail', dimensions: {width: 100}, relative: true, gravity: 'south', zoom: 4},
14-
{actionType: 'pad', dimensions: {width: 100}, relative: true, gravity: 'south', x: 3, y:4, background: 'white'},
15-
{actionType: 'limitPad', dimensions: {width: 100}, relative: true, gravity: 'south', x: 3, y:4, background: 'white'},
16-
{actionType: 'minimumPad', dimensions: {width: 100}, relative: true, gravity: 'south', x: 3, y:4, background: 'white'},
10+
{actionType: 'crop', dimensions: {width: 100}, regionRelative: true, gravity: {gravityType: 'direction', compass: 'north_east'}, y: 3, zoom: 7},
11+
{actionType: 'fill', dimensions: {width: 100}, relative: true, gravity: {gravityType: 'ocr'}, x: 4, y: 5},
12+
{actionType: 'limitFill', dimensions: {width: 100}, relative: true, gravity: {gravityType: 'direction', compass: 'south'}, x: 4, y: 5},
13+
{actionType: 'thumbnail', dimensions: {width: 100}, relative: true, gravity: {gravityType: 'direction', compass: 'south'}, zoom: 4},
14+
{actionType: 'pad', dimensions: {width: 100}, relative: true, gravity: {gravityType: 'direction', compass: 'south'}, x: 3, y:4, background: 'white'},
15+
{actionType: 'limitPad', dimensions: {width: 100}, relative: true, gravity: {gravityType: 'direction', compass: 'south'}, x: 3, y:4, background: 'white'},
16+
{actionType: 'minimumPad', dimensions: {width: 100}, relative: true, gravity: {gravityType: 'direction', compass: 'south'}, x: 3, y:4, background: 'white'},
1717
]);
1818

1919
expect(transformation.toString()).toStrictEqual([
@@ -22,7 +22,7 @@ describe('resize.fromJson', () => {
2222
'c_limit,fl_ignore_aspect_ratio,fl_relative,h_200',
2323
'c_mfit,fl_region_relative,w_100',
2424
'c_crop,fl_region_relative,g_north_east,w_100,y_3,z_7',
25-
'c_fill,fl_relative,g_south,w_100,x_4,y_5',
25+
'c_fill,fl_relative,g_ocr_text,w_100,x_4,y_5',
2626
'c_lfill,fl_relative,g_south,w_100,x_4,y_5',
2727
'c_thumb,fl_relative,g_south,w_100,z_4',
2828
'b_white,c_pad,fl_relative,g_south,w_100,x_3,y_4',

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import {Transformation} from '../../../src';
22
import {Resize} from "../../../src/actions";
33
import {AspectRatio} from "../../../src/qualifiers";
4+
import {Gravity} from "../../../src/qualifiers";
5+
import {FocusOn} from "../../../src/qualifiers/focusOn";
46

57
describe('resize.toJson()', () => {
68
it('scale', () => {
@@ -28,7 +30,8 @@ describe('resize.toJson()', () => {
2830
.addAction(Resize.thumbnail(100).gravity('south').zoom(4))
2931
.addAction(Resize.pad(100).gravity('south').offsetX(3).offsetY(4))
3032
.addAction(Resize.limitPad(100).gravity('south').offsetX(3).offsetY(4))
31-
.addAction(Resize.minimumPad(100).gravity('south').offsetX(3).offsetY(4));
33+
.addAction(Resize.minimumPad(100).gravity('south').offsetX(3).offsetY(4))
34+
.addAction(Resize.fill(100, 200).gravity(Gravity.focusOn(FocusOn.ocr())));
3235
expect(transformation.toJson()).toStrictEqual([
3336
{
3437
"actionType": "scale",
@@ -142,6 +145,16 @@ describe('resize.toJson()', () => {
142145
},
143146
x: 3,
144147
y: 4
148+
},
149+
{
150+
actionType: "fill",
151+
dimensions: {
152+
height: 200,
153+
width: 100,
154+
},
155+
gravity: {
156+
gravityType: "ocr",
157+
},
145158
}
146159
]);
147160
});

src/actions/resize/ResizeAdvancedAction.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@ import {IGravity} from "../../qualifiers/gravity/GravityQualifier.js";
33
import {Qualifier} from "../../internal/qualifier/Qualifier.js";
44
import {IActionModel} from "../../internal/models/IActionModel.js";
55
import {createGravityModel} from "../../internal/models/createGravityModel.js";
6+
import {createGravityFromModel} from "../../internal/models/createGravityFromModel.js";
7+
import {IResizeAdvancedActionModel} from "../../internal/models/IResizeAdvancedActionModel.js";
68

79
/**
810
* @description Defines an advanced resize.
911
* @extends Actions.Resize.ResizeSimpleAction
1012
* @memberOf Actions.Resize
1113
* @see Visit {@link Actions.Resize| Resize} for examples
1214
*/
13-
class ResizeAdvancedAction extends ResizeSimpleAction {
15+
class ResizeAdvancedAction extends ResizeSimpleAction{
16+
protected _actionModel: IResizeAdvancedActionModel;
17+
1418
/**
1519
* @description Which part of the original image to include.
1620
* @param {Qualifiers.Gravity} gravity
@@ -24,7 +28,10 @@ class ResizeAdvancedAction extends ResizeSimpleAction {
2428

2529
static fromJson(actionModel: IActionModel): ResizeAdvancedAction {
2630
const result = super.fromJson.apply(this, [actionModel]);
27-
actionModel.gravity && result.gravity(actionModel.gravity);
31+
32+
if (actionModel.gravity) {
33+
result.gravity(createGravityFromModel(actionModel.gravity));
34+
}
2835

2936
return result;
3037
}

src/actions/resize/ResizeSimpleAction.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {ACTION_TYPE_TO_CROP_MODE_MAP, CROP_MODE_TO_ACTION_TYPE_MAP} from "../../
1717
* @see Visit {@link Actions.Resize| Resize} for examples
1818
*/
1919
class ResizeSimpleAction extends Action {
20-
protected _actionModel: IResizeSimpleActionModel = {dimensions: {}};
20+
protected _actionModel: IResizeSimpleActionModel;
2121

2222
/**
2323
* @param {string} cropType
@@ -26,7 +26,7 @@ class ResizeSimpleAction extends Action {
2626
*/
2727
constructor(cropType: string, cropWidth: number | string, cropHeight?: number | string) {
2828
super();
29-
29+
this._actionModel = {dimensions: {}};
3030
this._actionModel.actionType = CROP_MODE_TO_ACTION_TYPE_MAP[cropType] || cropType;
3131
this.addQualifier(new Qualifier('c', cropType));
3232
cropWidth && this.width(cropWidth);
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import {IResizeSimpleActionModel} from "./IResizeSimpleActionModel.js";
2+
import {IGravityModel} from "./createGravityModel.js";
23

34
interface IResizeAdvancedActionModel extends IResizeSimpleActionModel{
4-
gravity: string;
5+
gravity: IGravityModel;
56
}
67

78
export {IResizeAdvancedActionModel};
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import {ICompassGravityModel, IGravityModel, IOcrGravityModel} from "./createGravityModel.js";
2+
import {IGravity} from "../../qualifiers/gravity/GravityQualifier.js";
3+
import {focusOn} from "../../qualifiers/gravity.js";
4+
import {ocr} from "../../qualifiers/focusOn.js";
5+
6+
/**
7+
* Validates that gravityModel is an ICompassGravityModel
8+
* @param gravityModel
9+
*/
10+
function isCompassGravityModel(gravityModel: IGravityModel): gravityModel is ICompassGravityModel {
11+
return gravityModel.gravityType === 'direction';
12+
}
13+
14+
/**
15+
* Validates that gravityModel is an IOcrGravityModel
16+
* @param gravityModel
17+
*/
18+
function isOcrGravityModel(gravityModel: IGravityModel): gravityModel is IOcrGravityModel {
19+
return gravityModel.gravityType === 'ocr';
20+
}
21+
22+
/**
23+
* Create gravity instance from given gravity model
24+
* @param gravityModel
25+
*/
26+
function createGravityFromModel(gravityModel: IGravityModel): IGravity{
27+
if (isCompassGravityModel(gravityModel)){
28+
return gravityModel.compass;
29+
}
30+
31+
if (isOcrGravityModel(gravityModel)) {
32+
return focusOn(ocr());
33+
}
34+
}
35+
36+
export {createGravityFromModel};
Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
import {IGravity} from "../../qualifiers/gravity/GravityQualifier.js";
2-
import {ICompassGravity, isICompassGravity} from "../../qualifiers/gravity/compassGravity/CompassGravity.js";
2+
import {ICompassGravity} from "../../qualifiers/gravity/compassGravity/CompassGravity.js";
33

44
export interface IGravityModel{
5-
gravityType: string;
5+
gravityType?: string;
66
}
77

88
export interface ICompassGravityModel extends IGravityModel{
99
compass: ICompassGravity
1010
}
1111

12+
export interface IOcrGravityModel extends IGravityModel{}
13+
14+
/**
15+
* Validate that given val is an ICompassGravity
16+
* @param val
17+
*/
18+
function isICompassGravity(val: unknown): val is ICompassGravity{
19+
return ['north', 'center', 'east', 'west', 'south', 'north_west', 'south_east', 'south_west', 'north_east'].includes(val as string);
20+
}
21+
1222
/**
1323
* Creates a compassGravity model
1424
* @param compass
@@ -20,16 +30,35 @@ function createCompassGravityModel(compass: ICompassGravity): ICompassGravityMod
2030
};
2131
}
2232

33+
/**
34+
* Validate that given string represents an ocr gravity
35+
* @param gravity
36+
*/
37+
function isIOcrGravity(gravity: string): boolean {
38+
return gravity === 'ocr_text';
39+
}
40+
41+
/**
42+
* Creates an ocr gravity model
43+
*/
44+
function createOcrGravityModel(): IOcrGravityModel {
45+
return {
46+
gravityType: 'ocr'
47+
};
48+
}
49+
2350
/**
2451
* Create a model of given gravity
2552
* @param gravity
2653
*/
27-
export function createGravityModel(gravity: IGravity): ICompassGravityModel | string {
28-
const gravityString = (typeof gravity === "string" ? gravity : (gravity).qualifierValue) as string;
54+
export function createGravityModel(gravity: IGravity): IGravityModel {
55+
const gravityString = `${(typeof gravity === "string" ? gravity : gravity.qualifierValue)}`;
2956

3057
if (isICompassGravity(gravityString)) {
3158
return createCompassGravityModel(gravityString);
3259
}
3360

34-
return gravityString;
61+
if (isIOcrGravity(gravityString)) {
62+
return createOcrGravityModel();
63+
}
3564
}

src/qualifiers/gravity/compassGravity/CompassGravity.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,6 @@ import {CompassQualifier} from "../qualifiers/compass/CompassQualifier.js";
33

44
type ICompassGravity = 'north' | 'center' | 'east' | 'west' | 'south' | 'north_west' | 'south_east' | 'south_west' | 'north_east';
55

6-
/**
7-
* Validate that given val is an ICompassGravity
8-
* @param val
9-
*/
10-
function isICompassGravity(val: unknown): val is ICompassGravity{
11-
return ['north', 'center', 'east', 'west', 'south', 'north_west', 'south_east', 'south_west', 'north_east'].includes(val as string);
12-
}
13-
146
/**
157
* @description The class for the CompassGravity builder
168
* @memberOf Qualifiers.Gravity
@@ -25,4 +17,4 @@ class CompassGravity extends GravityQualifier {
2517
}
2618
}
2719

28-
export {CompassGravity, ICompassGravity, isICompassGravity};
20+
export {CompassGravity, ICompassGravity};

0 commit comments

Comments
 (0)