// 표준화 된 상속 코드를 포함하고 있는 행 // 물론 실무에서는 실제 소스 코드에서 추출해와야 된다. var lines = [ "var BlendMode = MoGL.extend('BlendMode', {", "return Matrix.extend('Camera',{", "return MoGL.extend('Geometry', {", "var Group = Matrix.extend('Group', {", "return MoGL.extend('Material',{" ];
// child 이름을 추출하기 위한 정규표현식 var regexp0 = /'\w+'|"\w+"/;
// 추출에 사용되는 변수들 var line, splitted, parent, child, tmp, k;
// 위계 정보를 담고 있는 객체를 담는 Map var clsMoGLMap = {};
for (k in lines) { line = lines[k]; // parent, child 이름을 추출 if (line.indexOf(extendingPattern) > 0) { splitted = line.split(extendingPattern); parent = splitted[0].substring(splitted[0].lastIndexOf(' ') + 1); tmp = regexp0.exec(splitted[1])[0]; child = tmp.substring(1, tmp.length - 1); }
// 위계 정보를 담고 있는 객체를 구성해서 clsMoGLMap 에 추가 if (clsMoGLMap[parent]) { clsMoGLMap[parent].childrenNames = child; } else { clsMoGLMap[parent] = new ClsMoGL(); clsMoGLMap[parent].name = parent; clsMoGLMap[parent].childrenNames = child; }
if (clsMoGLMap[child]) { clsMoGLMap[child].parentName = parent; } else { clsMoGLMap[child] = new ClsMoGL(); clsMoGLMap[child].name = child; clsMoGLMap[child].parentName = parent; }
}
위계 정보를 담는 객체 ClsMoGL은 LinkedList와 비슷한 자료구조다. 애초에 단순히 텍스트에서 정보를 추출했기 때문에 텍스트를 담는 parentName, childrenNames가 추가되어 있다. 그리고 나중에 필요하다면 methods나 fields 같은 필드를 추가해서 더 많은 정보를 다이어그램에 표시할 수도 있다.
부모는 하나고 자식은 여럿일 수 있으므로 자식만 배열로 하면 된다. children, childrenNames 배열에는 편리하게 그냥 값 할당을 하면 내부적으로는 push()가 호출되도록 구현했다.
ClsMoGL을 담고 있는 clsMoGLMap를 재귀 함수 등을 이용해서 가공하면(사실 이 부분이 좀 복잡했는데 쉽게 이해할 수 있도록 설명하기는 어렵고, 이 방식이 가장 좋은 방식이라는 보장도 없으니, 필요하다면 그냥 소스 코드를 참고..) 대략 다음과 같은 json을 얻을 수 있다.
두말이 필요없는 굉장한 시각화 라이브러리인 D3.js에는 이런 위계 정보를 나타내는 다이어그램을 쉽게 만들 수 있는 여러가지 built-in 템플릿을 제공해준다. D3.js에는 이런 built-in 템플릿을 layout이라고 부른다.
D3.js의 Cluster layout을 사용하면 쉽게(?) 다이어그램을 그릴 수 있다.
여기서는 사실 http://bl.ocks.org/mbostock/4063570 에 있는 예제 중에서 d3.json()으로 json을 외부에서 가져오는 대신 위에서 만든 내부의 json을 사용하도록 변경한 부분 외에는 거의 그대로 갖다 썼다. 그래서 ‘쉽게’라고 할 수 있지만, 사실 D3.js가 그렇게 쉽지만은 않다.
D3.js는 여러가지 다이어그램을 쉽게 그릴 수 있게 해주는 다양한 built-in API가 제공되지만, D3.js를 만든 Mike Bostock 형님도 늘 강조하듯, 화려한 시각화 뒤에 숨어있는 D3.js의 진정한 마술은 데이터와 DOM 요소를 매핑해주는 부분에 있다. 이 부분을 시각화를 이용해서 잘 설명해준 글이 있는데, 너무 좋아서 번역을 해뒀으니 여기를 참고하면 D3.js를 배우는 데 도움이 될 것이다.