const fs = require("fs") let points = {} let rects = {} let edges = [] let mode, name, x, y, w, h, cx, cy, rx, ry, x2, y2 function add_point(x, y) { if (name in points) points[name].push([x,y]) else points[name] = [ [x,y] ] } function add_rect(x, y, w, h) { if (name in rects) rects[name].push([x,y,x+w,y+h]) else rects[name] = [ [x,y,x+w,y+h] ] } function flush() { if (mode === 'path') { edges.push([ x, y, x2, y2 ]) } if (mode === 'rect') { if (name.startsWith("$")) add_rect(x, y, w, h) else add_point( x + w/2, y + h/2 ) } if (mode === 'circle') { add_point( cx, cy ) } x = y = x2 = y2 = w = h = cx = cy = rx = ry = 0 } function parse_path_data(path) { let cx = 0 let cy = 0 let abs = 0 for (let i = 0; i < path.length;) { switch (path[i]) { case 'M': x = cx = Number(path[i+1]) y = cy = Number(path[i+2]) i += 3 abs = true break case 'm': x = cx = cx + Number(path[i+1]) y = cy = cy + Number(path[i+2]) i += 3 abs = false break case 'C': x2 = cx = Number(path[i+5]) y2 = cy = Number(path[i+6]) i += 7 abs = true break case 'L': i += 1 abs = true break case 'H': x2 = cx = Number(path[i+1]) i += 2 abs = true break case 'V': y2 = cy = Number(path[i+1]) i += 2 abs = true break case 'c': x2 = cx = cx + Number(path[i+5]) y2 = cy = cy + Number(path[i+6]) i += 7 break case 'l': i += 1 abs = false break case 'h': x2 = cx = cx + Number(path[i+1]) i += 2 abs = false break case 'v': y2 = cy = cy + Number(path[i+1]) i += 2 abs = false break default: if (abs) { x2 = cx = Number(path[i+0]) y2 = cy = Number(path[i+1]) } else { x2 = cx = cx + Number(path[i+0]) y2 = cy = cy + Number(path[i+1]) } i += 2 break } } } for (let line of fs.readFileSync("tools/layout.svg", "utf-8").split("\n")) { line = line.trim() if (line.startsWith("([^<]*)= x1 && x <= x2) if (y >= y1 && y <= y2) return true } return false } // FIND and label all points! let all_labels = labels.slice() let out = {} for (let key in points) { out = {} for (let [x, y] of points[key]) { let [ node, dist ] = find_closest_node(labels, x, y) if (dist > 10) { console.log(key,x,y, dist) } if (node) { if (node.name in out) console.log("DUPLICATE", node.name, x, y, out[node.name]) labels = labels.filter(x => x !== node) let suit = "UNKNOWN" if (find_enclosing_rect(rects.$CLUBS, x, y)) suit = "clubs" else if (find_enclosing_rect(rects.$HEARTS, x, y)) suit = "hearts" else if (find_enclosing_rect(rects.$DIAMONDS, x, y)) suit = "diamonds" else if (find_enclosing_rect(rects.$SPADES, x, y)) suit = "spades" else console.log("NOT ASSIGNED SUIT", x, y) out[node.name] = [x, y, dist, suit] } else { let [ dupname, dupdist ] = find_closest_node(all_labels, x, y) console.log("ALREADY USED", dupname, dupdist, x, y, "OLD", out[dupname]) } } }