|
|
|
@ -5,4 +5,80 @@ const isContentEditable = (element) => { |
|
|
|
|
); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
export { isContentEditable }; |
|
|
|
|
const rectangleCoordsRect = (coords) => { |
|
|
|
|
let [left, top, right, bottom] = coords.split(',').map(n => Number(n)); |
|
|
|
|
return { left, top, right, bottom }; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const circleCoordsRect = (coords) => { |
|
|
|
|
let [x, y, r] = coords.split(',').map(n => Number(n)); |
|
|
|
|
return { |
|
|
|
|
left: x - r, |
|
|
|
|
top: y - r, |
|
|
|
|
right: x + r, |
|
|
|
|
bottom: y + r, |
|
|
|
|
}; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const polygonCoordsRect = (coords) => { |
|
|
|
|
let params = coords.split(','); |
|
|
|
|
let minx = Number(params[0]), |
|
|
|
|
maxx = Number(params[0]), |
|
|
|
|
miny = Number(params[1]), |
|
|
|
|
maxy = Number(params[1]); |
|
|
|
|
let len = Math.floor(params.length / 2); |
|
|
|
|
for (let i = 2; i < len; i += 2) { |
|
|
|
|
let x = Number(params[i]), |
|
|
|
|
y = Number(params[i + 1]); |
|
|
|
|
if (x < minx) { |
|
|
|
|
minx = x; |
|
|
|
|
} |
|
|
|
|
if (x > maxx) { |
|
|
|
|
maxx = x; |
|
|
|
|
} |
|
|
|
|
if (y < miny) { |
|
|
|
|
miny = y; |
|
|
|
|
} |
|
|
|
|
if (y > maxy) { |
|
|
|
|
maxy = y; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return { left: minx, top: miny, right: maxx, bottom: maxy }; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const viewportRect = (e) => { |
|
|
|
|
if (e.tagName !== 'AREA') { |
|
|
|
|
return e.getBoundingClientRect(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
let mapElement = e.parentNode; |
|
|
|
|
let imgElement = document.querySelector(`img[usemap="#${mapElement.name}"]`); |
|
|
|
|
let { |
|
|
|
|
left: mapLeft, |
|
|
|
|
top: mapTop |
|
|
|
|
} = imgElement.getBoundingClientRect(); |
|
|
|
|
let coords = e.getAttribute('coords'); |
|
|
|
|
let rect = { left: 0, top: 0, right: 0, bottom: 0 }; |
|
|
|
|
switch (e.getAttribute('shape')) { |
|
|
|
|
case 'rect': |
|
|
|
|
case 'rectangle': |
|
|
|
|
rect = rectangleCoordsRect(coords); |
|
|
|
|
break; |
|
|
|
|
case 'circ': |
|
|
|
|
case 'circle': |
|
|
|
|
rect = circleCoordsRect(coords); |
|
|
|
|
break; |
|
|
|
|
case 'poly': |
|
|
|
|
case 'polygon': |
|
|
|
|
rect = polygonCoordsRect(coords); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
return { |
|
|
|
|
left: rect.left + mapLeft, |
|
|
|
|
top: rect.top + mapTop, |
|
|
|
|
right: rect.right + mapLeft, |
|
|
|
|
bottom: rect.bottom + mapTop, |
|
|
|
|
}; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
export { isContentEditable, viewportRect }; |
|
|
|
|