| /* |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| var svgNS = "http://www.w3.org/2000/svg" |
| |
| |
| function fastIntersect(x,y,nx,ny) { |
| if (x.getAttribute("id") == y.getAttribute("id")) { // can't collide with itself |
| return false |
| } |
| var spacing = 2 // number of pixels to keep elements apart |
| nx = nx ? nx : 0 |
| ny = ny ? ny : 0 |
| var a = x.getBoundingClientRect() |
| var b = y.getBoundingClientRect() |
| return !(b.left-spacing > (a.right+nx) |
| || b.right+spacing < (a.left+nx) |
| || b.top-spacing > (a.bottom+ny) |
| || b.bottom+spacing < (a.top+ny)); |
| } |
| |
| function makeWord(word, size) { |
| var txt = document.createElementNS(svgNS, "text"); |
| txt.setAttribute("font-size", size + "px") |
| txt.setAttribute("x", "0") |
| txt.setAttribute("y", "40") |
| txt.setAttribute("class", "cloudword") |
| txt.setAttribute("onclick", "searchTop(\"" + word + "\", 'lte=1M')") |
| txt.textContent = word |
| return txt |
| } |
| |
| function wordCloud(hash, width, height, debug) { |
| var total = 0 |
| var boxes = [] |
| var space = width * height |
| for (i in hash) { |
| total += Math.sqrt(hash[i]) |
| } |
| var hashSorted = [] |
| for (word in hash) hashSorted.push(word) |
| hashSorted = hashSorted.sort(function(a,b) { return hash[a] > hash[b] }) |
| var svg = document.createElementNS(svgNS, "svg"); |
| document.body.appendChild(svg) |
| svg.setAttribute("width", width) |
| svg.setAttribute("height", height) |
| svg.setAttribute("class", "wordcloud") |
| for (var n in hashSorted) { |
| var word = hashSorted[n] |
| var size = 0; |
| var expected_area = ( Math.sqrt(hash[word]) / total ) * (space*0.9) |
| if (debug) { |
| console.log(expected_area) |
| } |
| |
| var txt = document.createElementNS(svgNS, "text"); |
| txt.textContent = word |
| txt.setAttribute("font-size", "100px") |
| svg.appendChild(txt) |
| |
| w = txt.getBoundingClientRect(); |
| |
| for (var s = 100; s > 0; s-=1) { |
| |
| var area = w.width * w.height * ( (s/100)*(s/100) ); |
| if (area <= expected_area ) { |
| size = s; |
| svg.removeChild(txt) |
| break |
| } |
| } |
| |
| |
| |
| var theta = 50; |
| var prop = height/width |
| var popped = false |
| |
| var angle = 0; |
| |
| // Try with random placement |
| var gw = svg.getBoundingClientRect() |
| var w |
| |
| |
| |
| var txt = makeWord(word, ss) |
| txt.setAttribute("id", "wordcloud_" + word) |
| svg.appendChild(txt) |
| if (!popped) { |
| txt.setAttribute("x", 0) |
| txt.setAttribute("y", 0) |
| for (var ss = size; ss > 5; ss *= 0.9) { |
| // alert(ss) |
| if (popped) { |
| break |
| } |
| txt.setAttribute("font-size", ss + "px") |
| |
| var w = txt.getBoundingClientRect() |
| for (var l = 0; l < 80; l++) { |
| var nx = 4 + (Math.random() * (width-8-w.width)) |
| var ny = 4 + w.height + ((l/80) * (height-8-w.height)) |
| var it = false |
| for (var b in boxes) { |
| if (fastIntersect(txt, boxes[b], nx, ny)) { |
| it = true |
| break |
| } |
| } |
| if (it == false) { |
| popped = true |
| txt.setAttribute("x", nx) |
| txt.setAttribute("y", ny) |
| break |
| } |
| } |
| } |
| } |
| |
| |
| |
| if (popped) { |
| var color = 'hsl('+ Math.random()*360 +', 40%, 50%)'; |
| txt.setAttribute("fill", color) |
| boxes.push(txt) |
| } else { |
| //alert("Could not add " + word) |
| svg.removeChild(txt) |
| } |
| |
| } |
| |
| // Try to size up texts a bit |
| var ts = 0 |
| for (var i in boxes) { |
| var txt = boxes[i] |
| var osize = parseFloat(txt.getAttribute('font-size')) |
| var psize = osize |
| for (var n = 1; n < 1.4; n+=0.025) { |
| var nsize = osize * n |
| txt.setAttribute("font-size", nsize + "px") |
| var w = txt.getBoundingClientRect() |
| var good = true |
| for (var b in boxes) { |
| if (fastIntersect(txt, boxes[b])) { |
| good = false |
| break |
| } |
| } |
| if (!good || w.right > width-4 || w.top < 4) { |
| txt.setAttribute("font-size", psize + "px") |
| break |
| } |
| psize = nsize |
| ts++ |
| } |
| } |
| document.body.removeChild(svg) |
| return svg |
| } |