diff options
author | Shin'ya Ueoka <ueokande@i-beam.org> | 2017-11-02 11:41:11 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-02 11:41:11 +0000 |
commit | 9f1a18352fcac690ea714e84f6b1f6d6201ffd67 (patch) | |
tree | eced7b1cc76935aea8e9de2a0cbf79649b032052 /src/shared/utils | |
parent | c4996ef5d8d5d85f49732bb01b6da13b66ea81d5 (diff) | |
parent | 14241ca842b7dc92f26252a0ac7bb7e549d560c8 (diff) |
Merge pull request #123 from ueokande/64-follow-area-tags
follow area tags
Diffstat (limited to 'src/shared/utils')
-rw-r--r-- | src/shared/utils/dom.js | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/src/shared/utils/dom.js b/src/shared/utils/dom.js index c111ee7..d4fd68a 100644 --- a/src/shared/utils/dom.js +++ b/src/shared/utils/dom.js @@ -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 }; |