Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0cf82fe

Browse files
committed
Lib: Add getTranslate and setTranslate methods and tests
1 parent b55f9c0 commit 0cf82fe

File tree

2 files changed

+123
-0
lines changed

2 files changed

+123
-0
lines changed

src/lib/index.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,42 @@ lib.addStyleRule = function(selector, styleString) {
430430
else console.warn('addStyleRule failed');
431431
};
432432

433+
lib.getTranslate = function(element) {
434+
435+
var re = /(\btranslate\()(\d*\.?\d*)([^\d]*)(\d*\.?\d*)([^\d]*)(.*)/,
436+
getter = element.attr ? 'attr' : 'getAttribute',
437+
transform = element[getter]('transform') || '';
438+
439+
var translate = transform.replace(re, function(match, p1, p2, p3, p4) {
440+
return [p2, p4].join(' ');
441+
})
442+
.split(' ');
443+
444+
return {
445+
x: +translate[0] || 0,
446+
y: +translate[1] || 0
447+
};
448+
};
449+
450+
lib.setTranslate = function(element, x, y) {
451+
452+
var re = /(\btranslate\(.*?\);?)/,
453+
getter = element.attr ? 'attr' : 'getAttribute',
454+
setter = element.attr ? 'attr' : 'setAttribute',
455+
transform = element[getter]('transform') || '';
456+
457+
x = x || 0;
458+
y = y || 0;
459+
460+
transform = transform.replace(re, '').trim();
461+
transform += ' translate(' + x + ', ' + y + ')';
462+
transform = transform.trim();
463+
464+
element[setter]('transform', transform);
465+
466+
return transform;
467+
};
468+
433469
lib.isIE = function() {
434470
return typeof window.navigator.msSaveBlob !== 'undefined';
435471
};

test/jasmine/tests/lib_test.js

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,4 +770,91 @@ describe('Test lib.js:', function() {
770770
});
771771
});
772772

773+
fdescribe('getTranslate', function() {
774+
775+
it('should work with regular DOM elements', function() {
776+
var el = document.createElement('div');
777+
778+
expect(Lib.getTranslate(el)).toEqual({ x: 0, y: 0 });
779+
780+
el.setAttribute('transform', 'translate(123.45px, 67)');
781+
expect(Lib.getTranslate(el)).toEqual({ x: 123.45, y: 67 });
782+
783+
el.setAttribute('transform', 'translate(123.45)');
784+
expect(Lib.getTranslate(el)).toEqual({ x: 123.45, y: 0 });
785+
786+
el.setAttribute('transform', 'translate(1 2)');
787+
expect(Lib.getTranslate(el)).toEqual({ x: 1, y: 2 });
788+
789+
el.setAttribute('transform', 'translate(1 2); rotate(20deg)');
790+
expect(Lib.getTranslate(el)).toEqual({ x: 1, y: 2 });
791+
792+
el.setAttribute('transform', 'rotate(20deg)');
793+
expect(Lib.getTranslate(el)).toEqual({ x: 0, y: 0 });
794+
});
795+
796+
it('should work with d3 elements', function() {
797+
var el = d3.select(document.createElement('div'));
798+
799+
el.attr('transform', 'translate(123.45px, 67)');
800+
expect(Lib.getTranslate(el)).toEqual({ x: 123.45, y: 67 });
801+
802+
el.attr('transform', 'translate(123.45)');
803+
expect(Lib.getTranslate(el)).toEqual({ x: 123.45, y: 0 });
804+
805+
el.attr('transform', 'translate(1 2)');
806+
expect(Lib.getTranslate(el)).toEqual({ x: 1, y: 2 });
807+
808+
el.attr('transform', 'translate(1 2); rotate(20)');
809+
expect(Lib.getTranslate(el)).toEqual({ x: 1, y: 2 });
810+
811+
el.attr('transform', 'rotate(20)');
812+
expect(Lib.getTranslate(el)).toEqual({ x: 0, y: 0 });
813+
});
814+
815+
});
816+
817+
fdescribe('setTranslate', function() {
818+
819+
it('should work with regular DOM elements', function() {
820+
var el = document.createElement('div');
821+
822+
Lib.setTranslate(el, 5);
823+
expect(el.getAttribute('transform')).toBe('translate(5, 0)');
824+
825+
Lib.setTranslate(el, 10, 20);
826+
expect(el.getAttribute('transform')).toBe('translate(10, 20)');
827+
828+
Lib.setTranslate(el, 30, 40);
829+
expect(el.getAttribute('transform')).toBe('translate(30, 40)');
830+
831+
Lib.setTranslate(el);
832+
expect(el.getAttribute('transform')).toBe('translate(0, 0)');
833+
834+
el.setAttribute('transform', 'translate(0, 0); rotate(30)');
835+
Lib.setTranslate(el, 30, 40);
836+
expect(el.getAttribute('transform')).toBe('rotate(30) translate(30, 40)');
837+
});
838+
839+
it('should work with d3 elements', function() {
840+
var el = d3.select(document.createElement('div'));
841+
842+
Lib.setTranslate(el, 5);
843+
expect(el.attr('transform')).toBe('translate(5, 0)');
844+
845+
Lib.setTranslate(el, 10, 20);
846+
expect(el.attr('transform')).toBe('translate(10, 20)');
847+
848+
Lib.setTranslate(el, 30, 40);
849+
expect(el.attr('transform')).toBe('translate(30, 40)');
850+
851+
Lib.setTranslate(el);
852+
expect(el.attr('transform')).toBe('translate(0, 0)');
853+
854+
el.attr('transform', 'translate(0, 0); rotate(30)');
855+
Lib.setTranslate(el, 30, 40);
856+
expect(el.attr('transform')).toBe('rotate(30) translate(30, 40)');
857+
});
858+
});
859+
773860
});

0 commit comments

Comments
 (0)