├── info-icon.png ├── photos └── simpsons │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ ├── 10.png │ ├── 100.png │ ├── 101.png │ ├── 102.png │ ├── 103.png │ ├── 104.png │ ├── 105.png │ ├── 106.png │ ├── 107.png │ ├── 108.png │ ├── 109.png │ ├── 11.png │ ├── 110.png │ ├── 111.png │ ├── 112.png │ ├── 113.png │ ├── 114.png │ ├── 115.png │ ├── 116.png │ ├── 117.png │ ├── 118.png │ ├── 119.png │ ├── 12.png │ ├── 120.png │ ├── 121.png │ ├── 122.png │ ├── 123.png │ ├── 124.png │ ├── 125.png │ ├── 126.png │ ├── 127.png │ ├── 128.png │ ├── 129.png │ ├── 13.png │ ├── 130.png │ ├── 131.png │ ├── 132.png │ ├── 133.png │ ├── 134.png │ ├── 135.png │ ├── 136.png │ ├── 137.png │ ├── 138.png │ ├── 139.png │ ├── 14.png │ ├── 140.png │ ├── 141.png │ ├── 142.png │ ├── 143.png │ ├── 144.png │ ├── 145.png │ ├── 146.png │ ├── 147.png │ ├── 148.png │ ├── 149.png │ ├── 15.png │ ├── 150.png │ ├── 151.png │ ├── 152.png │ ├── 153.png │ ├── 154.png │ ├── 155.png │ ├── 156.png │ ├── 157.png │ ├── 158.png │ ├── 159.png │ ├── 16.png │ ├── 160.png │ ├── 161.png │ ├── 162.png │ ├── 163.png │ ├── 164.png │ ├── 165.png │ ├── 166.png │ ├── 167.png │ ├── 168.png │ ├── 169.png │ ├── 17.png │ ├── 170.png │ ├── 171.png │ ├── 172.png │ ├── 173.png │ ├── 174.png │ ├── 175.png │ ├── 176.png │ ├── 177.png │ ├── 178.png │ ├── 179.png │ ├── 18.png │ ├── 180.png │ ├── 181.png │ ├── 182.png │ ├── 183.png │ ├── 184.png │ ├── 185.png │ ├── 186.png │ ├── 187.png │ ├── 188.png │ ├── 189.png │ ├── 19.png │ ├── 190.png │ ├── 191.png │ ├── 192.png │ ├── 193.png │ ├── 194.png │ ├── 195.png │ ├── 196.png │ ├── 197.png │ ├── 198.png │ ├── 199.png │ ├── 20.png │ ├── 200.png │ ├── 201.png │ ├── 202.png │ ├── 203.png │ ├── 204.png │ ├── 205.png │ ├── 206.png │ ├── 207.png │ ├── 208.png │ ├── 209.png │ ├── 21.png │ ├── 210.png │ ├── 211.png │ ├── 212.png │ ├── 213.png │ ├── 214.png │ ├── 215.png │ ├── 216.png │ ├── 217.png │ ├── 218.png │ ├── 219.png │ ├── 22.png │ ├── 220.png │ ├── 221.png │ ├── 222.png │ ├── 223.png │ ├── 224.png │ ├── 225.png │ ├── 226.png │ ├── 227.png │ ├── 228.png │ ├── 229.png │ ├── 23.png │ ├── 230.png │ ├── 231.png │ ├── 232.png │ ├── 233.png │ ├── 234.png │ ├── 235.png │ ├── 236.png │ ├── 237.png │ ├── 238.png │ ├── 239.png │ ├── 24.png │ ├── 240.png │ ├── 241.png │ ├── 242.png │ ├── 243.png │ ├── 244.png │ ├── 245.png │ ├── 246.png │ ├── 247.png │ ├── 248.png │ ├── 249.png │ ├── 25.png │ ├── 250.png │ ├── 251.png │ ├── 252.png │ ├── 253.png │ ├── 254.png │ ├── 255.png │ ├── 256.png │ ├── 257.png │ ├── 258.png │ ├── 259.png │ ├── 26.png │ ├── 260.png │ ├── 261.png │ ├── 262.png │ ├── 263.png │ ├── 264.png │ ├── 265.png │ ├── 266.png │ ├── 267.png │ ├── 268.png │ ├── 269.png │ ├── 27.png │ ├── 270.png │ ├── 271.png │ ├── 272.png │ ├── 273.png │ ├── 274.png │ ├── 275.png │ ├── 276.png │ ├── 277.png │ ├── 278.png │ ├── 279.png │ ├── 28.png │ ├── 280.png │ ├── 281.png │ ├── 282.png │ ├── 283.png │ ├── 284.png │ ├── 285.png │ ├── 286.png │ ├── 287.png │ ├── 288.png │ ├── 289.png │ ├── 29.png │ ├── 290.png │ ├── 291.png │ ├── 292.png │ ├── 293.png │ ├── 294.png │ ├── 295.png │ ├── 296.png │ ├── 297.png │ ├── 298.png │ ├── 299.png │ ├── 30.png │ ├── 31.png │ ├── 32.png │ ├── 33.png │ ├── 34.png │ ├── 35.png │ ├── 36.png │ ├── 37.png │ ├── 38.png │ ├── 39.png │ ├── 40.png │ ├── 41.png │ ├── 42.png │ ├── 43.png │ ├── 44.png │ ├── 45.png │ ├── 46.png │ ├── 47.png │ ├── 48.png │ ├── 49.png │ ├── 50.png │ ├── 51.png │ ├── 52.png │ ├── 53.png │ ├── 54.png │ ├── 55.png │ ├── 56.png │ ├── 57.png │ ├── 58.png │ ├── 59.png │ ├── 60.png │ ├── 61.png │ ├── 62.png │ ├── 63.png │ ├── 64.png │ ├── 65.png │ ├── 66.png │ ├── 67.png │ ├── 68.png │ ├── 69.png │ ├── 70.png │ ├── 71.png │ ├── 72.png │ ├── 73.png │ ├── 74.png │ ├── 75.png │ ├── 76.png │ ├── 77.png │ ├── 78.png │ ├── 79.png │ ├── 80.png │ ├── 81.png │ ├── 82.png │ ├── 83.png │ ├── 84.png │ ├── 85.png │ ├── 86.png │ ├── 87.png │ ├── 88.png │ ├── 89.png │ ├── 90.png │ ├── 91.png │ ├── 92.png │ ├── 93.png │ ├── 94.png │ ├── 95.png │ ├── 96.png │ ├── 97.png │ ├── 98.png │ └── 99.png ├── LICENSE ├── README.md ├── index.html ├── simpsons-family.txt └── family.js /info-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/info-icon.png -------------------------------------------------------------------------------- /photos/simpsons/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/1.png -------------------------------------------------------------------------------- /photos/simpsons/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/2.png -------------------------------------------------------------------------------- /photos/simpsons/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/3.png -------------------------------------------------------------------------------- /photos/simpsons/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/4.png -------------------------------------------------------------------------------- /photos/simpsons/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/5.png -------------------------------------------------------------------------------- /photos/simpsons/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/6.png -------------------------------------------------------------------------------- /photos/simpsons/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/7.png -------------------------------------------------------------------------------- /photos/simpsons/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/8.png -------------------------------------------------------------------------------- /photos/simpsons/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/9.png -------------------------------------------------------------------------------- /photos/simpsons/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/10.png -------------------------------------------------------------------------------- /photos/simpsons/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/100.png -------------------------------------------------------------------------------- /photos/simpsons/101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/101.png -------------------------------------------------------------------------------- /photos/simpsons/102.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/102.png -------------------------------------------------------------------------------- /photos/simpsons/103.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/103.png -------------------------------------------------------------------------------- /photos/simpsons/104.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/104.png -------------------------------------------------------------------------------- /photos/simpsons/105.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/105.png -------------------------------------------------------------------------------- /photos/simpsons/106.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/106.png -------------------------------------------------------------------------------- /photos/simpsons/107.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/107.png -------------------------------------------------------------------------------- /photos/simpsons/108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/108.png -------------------------------------------------------------------------------- /photos/simpsons/109.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/109.png -------------------------------------------------------------------------------- /photos/simpsons/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/11.png -------------------------------------------------------------------------------- /photos/simpsons/110.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/110.png -------------------------------------------------------------------------------- /photos/simpsons/111.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/111.png -------------------------------------------------------------------------------- /photos/simpsons/112.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/112.png -------------------------------------------------------------------------------- /photos/simpsons/113.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/113.png -------------------------------------------------------------------------------- /photos/simpsons/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/114.png -------------------------------------------------------------------------------- /photos/simpsons/115.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/115.png -------------------------------------------------------------------------------- /photos/simpsons/116.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/116.png -------------------------------------------------------------------------------- /photos/simpsons/117.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/117.png -------------------------------------------------------------------------------- /photos/simpsons/118.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/118.png -------------------------------------------------------------------------------- /photos/simpsons/119.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/119.png -------------------------------------------------------------------------------- /photos/simpsons/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/12.png -------------------------------------------------------------------------------- /photos/simpsons/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/120.png -------------------------------------------------------------------------------- /photos/simpsons/121.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/121.png -------------------------------------------------------------------------------- /photos/simpsons/122.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/122.png -------------------------------------------------------------------------------- /photos/simpsons/123.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/123.png -------------------------------------------------------------------------------- /photos/simpsons/124.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/124.png -------------------------------------------------------------------------------- /photos/simpsons/125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/125.png -------------------------------------------------------------------------------- /photos/simpsons/126.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/126.png -------------------------------------------------------------------------------- /photos/simpsons/127.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/127.png -------------------------------------------------------------------------------- /photos/simpsons/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/128.png -------------------------------------------------------------------------------- /photos/simpsons/129.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/129.png -------------------------------------------------------------------------------- /photos/simpsons/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/13.png -------------------------------------------------------------------------------- /photos/simpsons/130.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/130.png -------------------------------------------------------------------------------- /photos/simpsons/131.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/131.png -------------------------------------------------------------------------------- /photos/simpsons/132.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/132.png -------------------------------------------------------------------------------- /photos/simpsons/133.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/133.png -------------------------------------------------------------------------------- /photos/simpsons/134.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/134.png -------------------------------------------------------------------------------- /photos/simpsons/135.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/135.png -------------------------------------------------------------------------------- /photos/simpsons/136.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/136.png -------------------------------------------------------------------------------- /photos/simpsons/137.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/137.png -------------------------------------------------------------------------------- /photos/simpsons/138.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/138.png -------------------------------------------------------------------------------- /photos/simpsons/139.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/139.png -------------------------------------------------------------------------------- /photos/simpsons/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/14.png -------------------------------------------------------------------------------- /photos/simpsons/140.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/140.png -------------------------------------------------------------------------------- /photos/simpsons/141.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/141.png -------------------------------------------------------------------------------- /photos/simpsons/142.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/142.png -------------------------------------------------------------------------------- /photos/simpsons/143.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/143.png -------------------------------------------------------------------------------- /photos/simpsons/144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/144.png -------------------------------------------------------------------------------- /photos/simpsons/145.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/145.png -------------------------------------------------------------------------------- /photos/simpsons/146.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/146.png -------------------------------------------------------------------------------- /photos/simpsons/147.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/147.png -------------------------------------------------------------------------------- /photos/simpsons/148.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/148.png -------------------------------------------------------------------------------- /photos/simpsons/149.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/149.png -------------------------------------------------------------------------------- /photos/simpsons/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/15.png -------------------------------------------------------------------------------- /photos/simpsons/150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/150.png -------------------------------------------------------------------------------- /photos/simpsons/151.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/151.png -------------------------------------------------------------------------------- /photos/simpsons/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/152.png -------------------------------------------------------------------------------- /photos/simpsons/153.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/153.png -------------------------------------------------------------------------------- /photos/simpsons/154.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/154.png -------------------------------------------------------------------------------- /photos/simpsons/155.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/155.png -------------------------------------------------------------------------------- /photos/simpsons/156.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/156.png -------------------------------------------------------------------------------- /photos/simpsons/157.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/157.png -------------------------------------------------------------------------------- /photos/simpsons/158.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/158.png -------------------------------------------------------------------------------- /photos/simpsons/159.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/159.png -------------------------------------------------------------------------------- /photos/simpsons/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/16.png -------------------------------------------------------------------------------- /photos/simpsons/160.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/160.png -------------------------------------------------------------------------------- /photos/simpsons/161.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/161.png -------------------------------------------------------------------------------- /photos/simpsons/162.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/162.png -------------------------------------------------------------------------------- /photos/simpsons/163.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/163.png -------------------------------------------------------------------------------- /photos/simpsons/164.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/164.png -------------------------------------------------------------------------------- /photos/simpsons/165.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/165.png -------------------------------------------------------------------------------- /photos/simpsons/166.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/166.png -------------------------------------------------------------------------------- /photos/simpsons/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/167.png -------------------------------------------------------------------------------- /photos/simpsons/168.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/168.png -------------------------------------------------------------------------------- /photos/simpsons/169.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/169.png -------------------------------------------------------------------------------- /photos/simpsons/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/17.png -------------------------------------------------------------------------------- /photos/simpsons/170.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/170.png -------------------------------------------------------------------------------- /photos/simpsons/171.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/171.png -------------------------------------------------------------------------------- /photos/simpsons/172.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/172.png -------------------------------------------------------------------------------- /photos/simpsons/173.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/173.png -------------------------------------------------------------------------------- /photos/simpsons/174.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/174.png -------------------------------------------------------------------------------- /photos/simpsons/175.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/175.png -------------------------------------------------------------------------------- /photos/simpsons/176.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/176.png -------------------------------------------------------------------------------- /photos/simpsons/177.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/177.png -------------------------------------------------------------------------------- /photos/simpsons/178.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/178.png -------------------------------------------------------------------------------- /photos/simpsons/179.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/179.png -------------------------------------------------------------------------------- /photos/simpsons/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/18.png -------------------------------------------------------------------------------- /photos/simpsons/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/180.png -------------------------------------------------------------------------------- /photos/simpsons/181.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/181.png -------------------------------------------------------------------------------- /photos/simpsons/182.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/182.png -------------------------------------------------------------------------------- /photos/simpsons/183.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/183.png -------------------------------------------------------------------------------- /photos/simpsons/184.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/184.png -------------------------------------------------------------------------------- /photos/simpsons/185.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/185.png -------------------------------------------------------------------------------- /photos/simpsons/186.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/186.png -------------------------------------------------------------------------------- /photos/simpsons/187.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/187.png -------------------------------------------------------------------------------- /photos/simpsons/188.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/188.png -------------------------------------------------------------------------------- /photos/simpsons/189.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/189.png -------------------------------------------------------------------------------- /photos/simpsons/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/19.png -------------------------------------------------------------------------------- /photos/simpsons/190.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/190.png -------------------------------------------------------------------------------- /photos/simpsons/191.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/191.png -------------------------------------------------------------------------------- /photos/simpsons/192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/192.png -------------------------------------------------------------------------------- /photos/simpsons/193.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/193.png -------------------------------------------------------------------------------- /photos/simpsons/194.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/194.png -------------------------------------------------------------------------------- /photos/simpsons/195.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/195.png -------------------------------------------------------------------------------- /photos/simpsons/196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/196.png -------------------------------------------------------------------------------- /photos/simpsons/197.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/197.png -------------------------------------------------------------------------------- /photos/simpsons/198.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/198.png -------------------------------------------------------------------------------- /photos/simpsons/199.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/199.png -------------------------------------------------------------------------------- /photos/simpsons/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/20.png -------------------------------------------------------------------------------- /photos/simpsons/200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/200.png -------------------------------------------------------------------------------- /photos/simpsons/201.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/201.png -------------------------------------------------------------------------------- /photos/simpsons/202.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/202.png -------------------------------------------------------------------------------- /photos/simpsons/203.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/203.png -------------------------------------------------------------------------------- /photos/simpsons/204.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/204.png -------------------------------------------------------------------------------- /photos/simpsons/205.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/205.png -------------------------------------------------------------------------------- /photos/simpsons/206.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/206.png -------------------------------------------------------------------------------- /photos/simpsons/207.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/207.png -------------------------------------------------------------------------------- /photos/simpsons/208.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/208.png -------------------------------------------------------------------------------- /photos/simpsons/209.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/209.png -------------------------------------------------------------------------------- /photos/simpsons/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/21.png -------------------------------------------------------------------------------- /photos/simpsons/210.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/210.png -------------------------------------------------------------------------------- /photos/simpsons/211.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/211.png -------------------------------------------------------------------------------- /photos/simpsons/212.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/212.png -------------------------------------------------------------------------------- /photos/simpsons/213.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/213.png -------------------------------------------------------------------------------- /photos/simpsons/214.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/214.png -------------------------------------------------------------------------------- /photos/simpsons/215.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/215.png -------------------------------------------------------------------------------- /photos/simpsons/216.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/216.png -------------------------------------------------------------------------------- /photos/simpsons/217.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/217.png -------------------------------------------------------------------------------- /photos/simpsons/218.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/218.png -------------------------------------------------------------------------------- /photos/simpsons/219.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/219.png -------------------------------------------------------------------------------- /photos/simpsons/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/22.png -------------------------------------------------------------------------------- /photos/simpsons/220.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/220.png -------------------------------------------------------------------------------- /photos/simpsons/221.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/221.png -------------------------------------------------------------------------------- /photos/simpsons/222.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/222.png -------------------------------------------------------------------------------- /photos/simpsons/223.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/223.png -------------------------------------------------------------------------------- /photos/simpsons/224.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/224.png -------------------------------------------------------------------------------- /photos/simpsons/225.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/225.png -------------------------------------------------------------------------------- /photos/simpsons/226.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/226.png -------------------------------------------------------------------------------- /photos/simpsons/227.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/227.png -------------------------------------------------------------------------------- /photos/simpsons/228.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/228.png -------------------------------------------------------------------------------- /photos/simpsons/229.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/229.png -------------------------------------------------------------------------------- /photos/simpsons/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/23.png -------------------------------------------------------------------------------- /photos/simpsons/230.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/230.png -------------------------------------------------------------------------------- /photos/simpsons/231.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/231.png -------------------------------------------------------------------------------- /photos/simpsons/232.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/232.png -------------------------------------------------------------------------------- /photos/simpsons/233.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/233.png -------------------------------------------------------------------------------- /photos/simpsons/234.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/234.png -------------------------------------------------------------------------------- /photos/simpsons/235.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/235.png -------------------------------------------------------------------------------- /photos/simpsons/236.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/236.png -------------------------------------------------------------------------------- /photos/simpsons/237.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/237.png -------------------------------------------------------------------------------- /photos/simpsons/238.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/238.png -------------------------------------------------------------------------------- /photos/simpsons/239.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/239.png -------------------------------------------------------------------------------- /photos/simpsons/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/24.png -------------------------------------------------------------------------------- /photos/simpsons/240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/240.png -------------------------------------------------------------------------------- /photos/simpsons/241.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/241.png -------------------------------------------------------------------------------- /photos/simpsons/242.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/242.png -------------------------------------------------------------------------------- /photos/simpsons/243.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/243.png -------------------------------------------------------------------------------- /photos/simpsons/244.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/244.png -------------------------------------------------------------------------------- /photos/simpsons/245.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/245.png -------------------------------------------------------------------------------- /photos/simpsons/246.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/246.png -------------------------------------------------------------------------------- /photos/simpsons/247.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/247.png -------------------------------------------------------------------------------- /photos/simpsons/248.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/248.png -------------------------------------------------------------------------------- /photos/simpsons/249.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/249.png -------------------------------------------------------------------------------- /photos/simpsons/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/25.png -------------------------------------------------------------------------------- /photos/simpsons/250.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/250.png -------------------------------------------------------------------------------- /photos/simpsons/251.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/251.png -------------------------------------------------------------------------------- /photos/simpsons/252.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/252.png -------------------------------------------------------------------------------- /photos/simpsons/253.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/253.png -------------------------------------------------------------------------------- /photos/simpsons/254.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/254.png -------------------------------------------------------------------------------- /photos/simpsons/255.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/255.png -------------------------------------------------------------------------------- /photos/simpsons/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/256.png -------------------------------------------------------------------------------- /photos/simpsons/257.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/257.png -------------------------------------------------------------------------------- /photos/simpsons/258.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/258.png -------------------------------------------------------------------------------- /photos/simpsons/259.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/259.png -------------------------------------------------------------------------------- /photos/simpsons/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/26.png -------------------------------------------------------------------------------- /photos/simpsons/260.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/260.png -------------------------------------------------------------------------------- /photos/simpsons/261.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/261.png -------------------------------------------------------------------------------- /photos/simpsons/262.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/262.png -------------------------------------------------------------------------------- /photos/simpsons/263.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/263.png -------------------------------------------------------------------------------- /photos/simpsons/264.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/264.png -------------------------------------------------------------------------------- /photos/simpsons/265.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/265.png -------------------------------------------------------------------------------- /photos/simpsons/266.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/266.png -------------------------------------------------------------------------------- /photos/simpsons/267.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/267.png -------------------------------------------------------------------------------- /photos/simpsons/268.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/268.png -------------------------------------------------------------------------------- /photos/simpsons/269.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/269.png -------------------------------------------------------------------------------- /photos/simpsons/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/27.png -------------------------------------------------------------------------------- /photos/simpsons/270.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/270.png -------------------------------------------------------------------------------- /photos/simpsons/271.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/271.png -------------------------------------------------------------------------------- /photos/simpsons/272.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/272.png -------------------------------------------------------------------------------- /photos/simpsons/273.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/273.png -------------------------------------------------------------------------------- /photos/simpsons/274.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/274.png -------------------------------------------------------------------------------- /photos/simpsons/275.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/275.png -------------------------------------------------------------------------------- /photos/simpsons/276.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/276.png -------------------------------------------------------------------------------- /photos/simpsons/277.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/277.png -------------------------------------------------------------------------------- /photos/simpsons/278.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/278.png -------------------------------------------------------------------------------- /photos/simpsons/279.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/279.png -------------------------------------------------------------------------------- /photos/simpsons/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/28.png -------------------------------------------------------------------------------- /photos/simpsons/280.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/280.png -------------------------------------------------------------------------------- /photos/simpsons/281.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/281.png -------------------------------------------------------------------------------- /photos/simpsons/282.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/282.png -------------------------------------------------------------------------------- /photos/simpsons/283.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/283.png -------------------------------------------------------------------------------- /photos/simpsons/284.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/284.png -------------------------------------------------------------------------------- /photos/simpsons/285.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/285.png -------------------------------------------------------------------------------- /photos/simpsons/286.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/286.png -------------------------------------------------------------------------------- /photos/simpsons/287.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/287.png -------------------------------------------------------------------------------- /photos/simpsons/288.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/288.png -------------------------------------------------------------------------------- /photos/simpsons/289.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/289.png -------------------------------------------------------------------------------- /photos/simpsons/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/29.png -------------------------------------------------------------------------------- /photos/simpsons/290.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/290.png -------------------------------------------------------------------------------- /photos/simpsons/291.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/291.png -------------------------------------------------------------------------------- /photos/simpsons/292.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/292.png -------------------------------------------------------------------------------- /photos/simpsons/293.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/293.png -------------------------------------------------------------------------------- /photos/simpsons/294.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/294.png -------------------------------------------------------------------------------- /photos/simpsons/295.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/295.png -------------------------------------------------------------------------------- /photos/simpsons/296.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/296.png -------------------------------------------------------------------------------- /photos/simpsons/297.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/297.png -------------------------------------------------------------------------------- /photos/simpsons/298.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/298.png -------------------------------------------------------------------------------- /photos/simpsons/299.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/299.png -------------------------------------------------------------------------------- /photos/simpsons/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/30.png -------------------------------------------------------------------------------- /photos/simpsons/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/31.png -------------------------------------------------------------------------------- /photos/simpsons/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/32.png -------------------------------------------------------------------------------- /photos/simpsons/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/33.png -------------------------------------------------------------------------------- /photos/simpsons/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/34.png -------------------------------------------------------------------------------- /photos/simpsons/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/35.png -------------------------------------------------------------------------------- /photos/simpsons/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/36.png -------------------------------------------------------------------------------- /photos/simpsons/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/37.png -------------------------------------------------------------------------------- /photos/simpsons/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/38.png -------------------------------------------------------------------------------- /photos/simpsons/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/39.png -------------------------------------------------------------------------------- /photos/simpsons/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/40.png -------------------------------------------------------------------------------- /photos/simpsons/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/41.png -------------------------------------------------------------------------------- /photos/simpsons/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/42.png -------------------------------------------------------------------------------- /photos/simpsons/43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/43.png -------------------------------------------------------------------------------- /photos/simpsons/44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/44.png -------------------------------------------------------------------------------- /photos/simpsons/45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/45.png -------------------------------------------------------------------------------- /photos/simpsons/46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/46.png -------------------------------------------------------------------------------- /photos/simpsons/47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/47.png -------------------------------------------------------------------------------- /photos/simpsons/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/48.png -------------------------------------------------------------------------------- /photos/simpsons/49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/49.png -------------------------------------------------------------------------------- /photos/simpsons/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/50.png -------------------------------------------------------------------------------- /photos/simpsons/51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/51.png -------------------------------------------------------------------------------- /photos/simpsons/52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/52.png -------------------------------------------------------------------------------- /photos/simpsons/53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/53.png -------------------------------------------------------------------------------- /photos/simpsons/54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/54.png -------------------------------------------------------------------------------- /photos/simpsons/55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/55.png -------------------------------------------------------------------------------- /photos/simpsons/56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/56.png -------------------------------------------------------------------------------- /photos/simpsons/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/57.png -------------------------------------------------------------------------------- /photos/simpsons/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/58.png -------------------------------------------------------------------------------- /photos/simpsons/59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/59.png -------------------------------------------------------------------------------- /photos/simpsons/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/60.png -------------------------------------------------------------------------------- /photos/simpsons/61.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/61.png -------------------------------------------------------------------------------- /photos/simpsons/62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/62.png -------------------------------------------------------------------------------- /photos/simpsons/63.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/63.png -------------------------------------------------------------------------------- /photos/simpsons/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/64.png -------------------------------------------------------------------------------- /photos/simpsons/65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/65.png -------------------------------------------------------------------------------- /photos/simpsons/66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/66.png -------------------------------------------------------------------------------- /photos/simpsons/67.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/67.png -------------------------------------------------------------------------------- /photos/simpsons/68.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/68.png -------------------------------------------------------------------------------- /photos/simpsons/69.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/69.png -------------------------------------------------------------------------------- /photos/simpsons/70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/70.png -------------------------------------------------------------------------------- /photos/simpsons/71.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/71.png -------------------------------------------------------------------------------- /photos/simpsons/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/72.png -------------------------------------------------------------------------------- /photos/simpsons/73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/73.png -------------------------------------------------------------------------------- /photos/simpsons/74.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/74.png -------------------------------------------------------------------------------- /photos/simpsons/75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/75.png -------------------------------------------------------------------------------- /photos/simpsons/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/76.png -------------------------------------------------------------------------------- /photos/simpsons/77.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/77.png -------------------------------------------------------------------------------- /photos/simpsons/78.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/78.png -------------------------------------------------------------------------------- /photos/simpsons/79.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/79.png -------------------------------------------------------------------------------- /photos/simpsons/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/80.png -------------------------------------------------------------------------------- /photos/simpsons/81.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/81.png -------------------------------------------------------------------------------- /photos/simpsons/82.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/82.png -------------------------------------------------------------------------------- /photos/simpsons/83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/83.png -------------------------------------------------------------------------------- /photos/simpsons/84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/84.png -------------------------------------------------------------------------------- /photos/simpsons/85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/85.png -------------------------------------------------------------------------------- /photos/simpsons/86.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/86.png -------------------------------------------------------------------------------- /photos/simpsons/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/87.png -------------------------------------------------------------------------------- /photos/simpsons/88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/88.png -------------------------------------------------------------------------------- /photos/simpsons/89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/89.png -------------------------------------------------------------------------------- /photos/simpsons/90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/90.png -------------------------------------------------------------------------------- /photos/simpsons/91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/91.png -------------------------------------------------------------------------------- /photos/simpsons/92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/92.png -------------------------------------------------------------------------------- /photos/simpsons/93.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/93.png -------------------------------------------------------------------------------- /photos/simpsons/94.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/94.png -------------------------------------------------------------------------------- /photos/simpsons/95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/95.png -------------------------------------------------------------------------------- /photos/simpsons/96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/96.png -------------------------------------------------------------------------------- /photos/simpsons/97.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/97.png -------------------------------------------------------------------------------- /photos/simpsons/98.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/98.png -------------------------------------------------------------------------------- /photos/simpsons/99.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daveagp/family-tree/HEAD/photos/simpsons/99.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A simple family tree visualizer 2 | 3 | ## Demo 4 | https://daveagp.github.io/family-tree/index.html 5 | 6 | ## How to use 7 | * Create `family.txt` for your family 8 | * Put any photos into the `photos` directory 9 | * Change the first few lines of `family.js` 10 | 11 | ## Format of your family.txt file 12 | This file will contain 13 | * entries for couples, including their list of offspring 14 | * optionally, entries for individuals, including their lifespan and photo 15 | 16 | Entries for couples are formatted like this: 17 | ``` 18 | Name One + Name Two 19 | c: Child A, Child B, Child C 20 | n: Notes line(s), optional 21 | ``` 22 | If there are no children or no notes, leave those lines out. 23 | 24 | Entries for individuals can contain a `l`ifespan, `p`hoto, and `n`otes. 25 | ``` 26 | Name Of Person 27 | l: 1912-Dec 2100 28 | p: photo_filename.jpg 29 | n: Notes line(s), optional 30 | ``` 31 | All lines are optional, and if you have no lines, you need not fill out an entry for someone. 32 | Lifespans can be of the forms `start-end`, `start-` or `-end`. 33 | 34 | Here's a simple example file with 2 entries (one couple, one person) and 5 people total: 35 | ``` 36 | Homer Simpson + Marge Bouvier 37 | c: Lisa Simpson, Bart Simpson, Maggie Simpson 38 | n: Married while pregnant with Lisa 39 | Homer Simpson 40 | l: 1951- 41 | p: homer.jpg 42 | n: Nuclear Safety Inspector in Sector 7G 43 | ``` 44 | 45 | ## UI 46 | * The bar at top allows switching the level of detail shown 47 | * Click on a person to make them the root of the tree 48 | * Hover over a person to show all notes for them and their partners 49 | 50 | ## Data Tricks 51 | * You can leave someone's name as `?` if you don't know it. (Should be a parent or child's name in a couple's entry.) 52 | * Put comments in your `family.txt` by starting them with `#` 53 | * Multiple people with the same name can be disambiguated by putting a `#` after their name, followed by a distinct identifier (which will not be rendered). Example: 54 | ``` 55 | King George#Older + Mary of Teck 56 | c: King George#Younger 57 | ``` 58 | * http/s URLs in `n:` notes lines automatically are turned into links. They can't contain spaces. 59 | 60 | ## Data Limitations 61 | * This program can only handle topological trees, not marrying extended family or two marriages between families 62 | * Names shouldn't contain commas 63 | * If person `X` has two spouses, you need to list them as the first person in one couple and the second person in the other. E.g. `Partner1 + X` and `X + Partner2`. This is because the rendering engine uses the order in each couple as literal positional instructions 64 | * This program can't handle someone who has had more than two spouses/partners 65 | 66 | ## Disclaimer 67 | Use your judgment when posting sensitive family information on the internet, e.g. you may consider using `.htaccess` or some other appropriate security. 68 | 69 | ## Etc 70 | * Thanks to The [Simpsons Wiki](http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters) for their rich dataset. 71 | * See https://daveagp.wordpress.com/2018/04/22/family-tree-visualizer/ for an explanation of the general approach. 72 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 90 | 91 | Family Tree 92 | 93 |
94 |
95 | Family tree of 96 | and 97 | 105 | 106 | 107 |
108 |
109 |
110 | Hover your mouse on a person with for their information 111 |
See the source code on GitHub 112 |
113 | 116 |
117 | 118 | 119 | -------------------------------------------------------------------------------- /simpsons-family.txt: -------------------------------------------------------------------------------- 1 | Homer Simpson + Marge Simpson 2 | c: Bart Simpson#older 3 | n: blah blah blah blah blah 4 | Homer Simpson 5 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 6 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 7 | Marge Simpson 8 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 9 | Bart Simpson#older 10 | l: 1756- 11 | Bart Simpson#older + Lisa Simpson 12 | c: Maggie Simpson, Abraham Simpson II#older, ? 13 | Abraham Simpson II#older 14 | l: 1787- 15 | Lisa Simpson 16 | l: 1751-1843 17 | Maggie Simpson 18 | l: 1781-1859 19 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 20 | n: blah blah blah blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 21 | Ned Flanders + Charles Montgomery Burns 22 | c: Krusty the Clown, Moe Szyslak, ?, ? 23 | n: blah blah blah blah blah blah blah blah 24 | Moe Szyslak 25 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 26 | Moe Szyslak + Seymour Skinner#wife of William Evans 27 | c: Milhouse Van Houten, Edna Krabappel, Apu Nahasapeemapetilon#Jr. 28 | Apu Nahasapeemapetilon#Jr. 29 | l: 1788- 30 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 31 | Edna Krabappel 32 | l: 1786- 33 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 34 | Milhouse Van Houten 35 | l: 178{1/3}-1863 36 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 37 | n: blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 38 | Maggie Simpson + Milhouse Van Houten 39 | c: Eleanor Abernathy, Akira, Ms. Albright, Woody Allen, Tattoo Annie, Aristotle Amadopolis, State Comptroller Atkins 40 | n: blah blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 41 | Eleanor Abernathy 42 | l: 1805- 43 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 44 | Akira 45 | l: 1813- 46 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 47 | Tattoo Annie 48 | l: 1823-1846 49 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 50 | Woody Allen 51 | l: 1817- 52 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 53 | Ms. Albright 54 | l: 1816-1819 55 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 56 | Mary Bailey 57 | l: 1824-1886 58 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 59 | n: blah blah blah blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 60 | n: blah blah blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 61 | n: blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 62 | Aristotle Amadopolis 63 | l: 1827-1902 64 | p: simpsons/101.png 65 | n: blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 66 | n: blah blah blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters blah blah 67 | Mary Bailey + Aristotle Amadopolis 68 | n: blah blah blah blah blah blah blah blah blah 69 | c: Jasper Beardly, Benjamin (nerd), Bill (KBBL DJ), Billy (actor), Birch Barlow#Jr., Black Weasel#Jr., Blue-Haired Lawyer, Patty Bouvier, Selma Bouvier, Cowboy Bob 70 | Selma Bouvier 71 | n: blah blah blah 72 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 73 | n: blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 74 | l: 1881- 75 | Jasper Beardly 76 | n: blah blah blah blah 77 | p: simpsons/41.png 78 | l: 1848-1884 79 | n: blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 80 | Jasper Beardly + Robert Terwilliger 81 | c: Booberella 82 | n: blah blah blah blah blah blah blah blah blah blah 83 | Booberella 84 | p: simpsons/110.png 85 | l: Feb 4 1883-Feb 2 1967 86 | n: blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 87 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 88 | n: blah blah blah blah blah blah blah blah blah blah blah 89 | Benjamin (nerd) 90 | n: blah blah blah blah blah blah blah 91 | l: 1849-1885 92 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 93 | Bill (KBBL DJ) 94 | l: 185{0/1}-May 13, 1891 95 | n: blah blah 96 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 97 | n: blah blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 98 | Billy (actor) 99 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 100 | l: 1854- 101 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 102 | Birch Barlow#Jr. 103 | n: blah blah blah blah blah blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters blah 104 | l: 1857- 105 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 106 | Black Weasel#Jr. 107 | n: blah blah blah blah blah 108 | l: 1860- 109 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 110 | Blue-Haired Lawyer 111 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 112 | n: blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 113 | l: 1862- 114 | Blue-Haired Lawyer + Wendell Borton 115 | Patty Bouvier 116 | n: blah blah blah blah blah blah blah 117 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 118 | n: blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 119 | l: 186{3/5}- 120 | Brittany Brockman#Sr. 121 | l: 1849-1894 122 | n: blah blah blah blah 123 | n: blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 124 | Bill (KBBL DJ) + Brittany Brockman#Sr. 125 | c: Don Brodka, Lucille Botzcowski, Bumblebee Man#Jr., Capital City Goofball 126 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 127 | Carl Carlson 128 | l: 1852-Dec 30, 1930 129 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah 130 | p: simpsons/16.png 131 | Brittany Brockman#Sr. + Carl Carlson 132 | Don Brodka 133 | l: 1879-1961 134 | n: blah blah blah blah blah blah blah 135 | p: simpsons/25.png 136 | Cesar 137 | l: 1880-1966 138 | p: simpsons/178.png 139 | Don Brodka + Cesar 140 | c: Gary Chalmers, Charlie (SNPP), Chazz Busby, Scott Christian, Sebastian Cobb, Colin, Dr. Hector von Colossus 141 | Gary Chalmers 142 | l: 1902-1981 143 | n: blah blah blah blah blah blah 144 | Cora 145 | l: 1911-1974 146 | Gary Chalmers + Cora 147 | c: Mr. Costington 148 | Mr. Costington + Arthur Crandall 149 | c: Joey Crusher, Database 150 | n: blah 151 | Joey Crusher 152 | l: 1982- 153 | p: simpsons/185.png 154 | Database 155 | l: 1985- 156 | p: simpsons/24.png 157 | Mr. Costington 158 | p: simpsons/213.png 159 | Charlie (SNPP) + Declan Desmond 160 | c: Dewey Largo, Dwight Diddlehopper, Disco Stu 161 | Chazz Busby + Doug (nerd) 162 | c: Duffman, Eddie 163 | Scott Christian 164 | p: simpsons/201.png 165 | Scott Christian + Happy Little Elves 166 | c: Ernst 167 | Sebastian Cobb + Fat Tony 168 | c: Fallout Boy 169 | Colin 170 | n: blah blah 171 | Colin + Frankie the Squealer 172 | Dr. Hector von Colossus + Maude Flanders 173 | Lucille Botzcowski 174 | l: 1883-1929 175 | n: blah blah blah blah blah blah blah 176 | p: simpsons/271.png 177 | Rod Flanders + Lucille Botzcowski 178 | Rod Flanders 179 | p: simpsons/137.png 180 | Bumblebee Man#Jr. 181 | l: August 7, 1887-March 4, 1977 182 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 183 | n: blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 184 | p: simpsons/117.png 185 | Todd Flanders + ? 186 | c: Doris Freedman 187 | Doris Freedman 188 | n: blah blah blah blah blah blah blah blah blah blah blah blah 189 | l: Sep 18, 1888-May 17, 1925 190 | p: simpsons/130.png 191 | Doris Freedman + Bumblebee Man#Jr. 192 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 193 | c: Jonathan Frink, Frog Prince 194 | Gabbo 195 | l: May 30, 1883-October 9, 1983 196 | n: blah blah blah blah blah blah blah 197 | p: simpsons/115.png 198 | Bumblebee Man#Jr. + Gabbo 199 | n: blah blah blah blah blah blah blah blah blah 200 | Capital City Goofball 201 | l: 1889-1981 202 | n: blah blah blah blah blah blah blah blah blah blah blah blah 203 | p: simpsons/164.png 204 | n: blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 205 | Gary (nerd) 206 | l: 1887-1972 207 | Capital City Goofball + Gary (nerd) 208 | c: Gavin, Alice Glick, Gloria Jailbird, Gloria (White Christmas Blues) 209 | Gavin 210 | l: 1916-June 25, 2014 211 | p: simpsons/118.png 212 | n: blah blah blah blah 213 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 214 | Gavin + Gloria's Husband 215 | c: God 216 | Grady + God 217 | God + ? 218 | c: Frank Grimes, Frank Grimes Jr., Matt Groening (character) 219 | Alice Glick 220 | l: 1920-November 2007 221 | p: simpsons/71.png 222 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah 223 | Alice Glick + Barney Gumble 224 | c: Gil Gunderson, Gunter, Handsome Pete, Judge Constance Harm 225 | Gil Gunderson + Herman Hermann 226 | c: Bernice Hibbert, Julius Hibbert, Elizabeth Hoover, Lionel Hutz#Distinct from aunt 227 | Gunter + Itchy 228 | c: Jack Lassen, Jeremy Jailbird 229 | Handsome Pete + Snake Jailbird 230 | c: Jake the Barber, Jacques, Comic Book Guy 231 | Judge Constance Harm + Jeremy Freedman 232 | c: Jericho, Joey (mafia), John (Homer's Phobia) 233 | Gloria Jailbird 234 | l: 1922- 235 | Gloria Jailbird + Jimbo Jones 236 | Gloria (White Christmas Blues) 237 | l: 1926- 238 | Gloria (White Christmas Blues) + Rachel Jordan 239 | c: Julio, Kang 240 | Frog Prince 241 | l: February 7, 1918-July 10, 2015 242 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 243 | p: simpsons/224.png 244 | Jonathan Frink 245 | l: August 5, 1915-December 24, 1965 246 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 247 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 248 | p: simpsons/85.png 249 | Princess Kashmir + Jonathan Frink 250 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 251 | c: Kent Brockman, Kodos, Leon Kompowsky 252 | ? + Coach Krupt 253 | c: Princess Kashmir, Rabbi Hyman Krustofsky 254 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 255 | Coach Krupt 256 | l: -~1920 257 | Princess Kashmir 258 | l: 1916-September 12, 1987 259 | p: simpsons/23.png 260 | Rabbi Hyman Krustofsky 261 | l: ~1918- 262 | Kodos 263 | l: December 7, 1949-1950 264 | n: blah blah blah 265 | Kent Brockman 266 | l: February 21, 1947-February 17, 2013 267 | p: simpsons/76.png 268 | Leon Kompowsky 269 | l: May 5, 1953-September 15, 1995 270 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 271 | p: simpsons/82.png 272 | Kumiko Albertson + Kent Brockman 273 | n: blah blah blah blah blah blah blah blah blah blah 274 | Kent Brockman + Cookie Kwan 275 | c: Chester J. Lampwick 276 | n: blah blah blah blah 277 | Cookie Kwan 278 | p: simpsons/50.png 279 | Chester J. Lampwick 280 | l: October 21, 1998- 281 | p: simpsons/189.png 282 | Lard Lad + Leon Kompowsky 283 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 284 | c: Larry (barfly), The Leader, Legs 285 | Larry (barfly) 286 | l: May 7, 1982- 287 | p: simpsons/51.png 288 | The Leader 289 | l: March 12, 1985- 290 | p: simpsons/155.png 291 | Legs 292 | l: March 12, 1987- 293 | p: simpsons/205.png 294 | Lard Lad 295 | l: August 21 1955- 296 | n: blah blah blah blah blah 297 | p: simpsons/130.png 298 | Larry (barfly) + Lenny Leonard 299 | n: blah blah blah blah 300 | c: Leopold 301 | Leopold 302 | l: March 21, 2017- 303 | n: blah blah blah blah 304 | p: simpsons/28.png 305 | The Leader + Leprechaun 306 | n: blah blah blah blah 307 | Leprechaun 308 | p: simpsons/269.png 309 | n: blah blah blah 310 | l: July 8, 198?- 311 | Lewis Clark + Ling Bouvier 312 | c: Professor Lombardo, Lou 313 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 314 | Lou 315 | p: simpsons/202.png 316 | l: 1923-November 30 2014 317 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 318 | Lou + Louie (mafia) 319 | c: Helen Lovejoy, Jessica Lovejoy, Lowblow, Luann Van Houten, Lugash 320 | Professor Lombardo 321 | p: simpsons/40.png 322 | l: Jan 29, 1921-Feb 28, 2000 323 | Professor Lombardo + Lurleen Lumpkin 324 | c: Lyle Lanley, Horatio McCallister, Mr. McGreg 325 | Lurleen Lumpkin 326 | p: simpsons/170.png 327 | Mr. McGreg 328 | p: simpsons/16.png 329 | Horatio McCallister 330 | p: simpsons/164.png 331 | Horatio McCallister + Just Stamp the Ticket Man 332 | c: Jack Marley 333 | Jack Marley 334 | l: 2005- 335 | p: simpsons/248.png 336 | Lyle Lanley 337 | p: simpsons/158.png 338 | Marty (KBBL DJ) + Lyle Lanley 339 | c: Mayor Quimby's Body Guards, Troy McClure 340 | Lyle Lanley + Melvin Van Horne 341 | Melvin Van Horne + Roger Meyers Jr. 342 | c: Milo 343 | Hans Moleman + ? 344 | c: Ling Bouvier 345 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 346 | Hans Moleman 347 | p: simpsons/43.png 348 | Marvin Monroe 349 | p: simpsons/22.png 350 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 351 | n: blah blah blah blah blah blah blah blah blah blah blah blah http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 352 | Ling Bouvier + Marvin Monroe 353 | c: Mervin Monroe 354 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 355 | Ling Bouvier 356 | p: simpsons/38.png 357 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 358 | l: 1902/07/07-198? 359 | Mervin Monroe 360 | l: 1930/12/3- 361 | n: blah blah blah blah 362 | p: simpsons/247.png 363 | Nelson Muntz 364 | p: simpsons/257.png 365 | n: blah blah blah blah blah blah 366 | Eddie Muntz 367 | p: simpsons/38.png 368 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 369 | Nelson Muntz + Eddie Muntz 370 | c: Mrs. Muntz, Captain Lance Murdock#Sr., Bleeding Gums Murphy 371 | n: blah blah blah blah blah blah blah blah 372 | Mrs. Muntz 373 | l: 1926-Aug 24 2016 374 | n: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 375 | n: http://simpsons.wikia.com/wiki/Portal:All_Simpson_Characters 376 | p: simpsons/26.png 377 | Captain Lance Murdock#Sr. 378 | l: 1928/2/12-1978/12/25 379 | n: blah blah blah blah blah blah blah blah blah blah 380 | p: simpsons/87.png 381 | Mervin Monroe + Captain Lance Murdock#Sr. 382 | n: blah blah 383 | c: Lindsey Naegle, Lard Lad, Manjula Nahasapeemapetilon 384 | Sanjay Nahasapeemapetilon + The Nahasapeemapetilon Octuplets 385 | c: Old Jewish Man 386 | Old Jewish Man 387 | l: 1969/2/19- 388 | n: blah blah blah blah blah 389 | p: simpsons/258.png 390 | Manjula Nahasapeemapetilon 391 | l: 1965/4/1- 392 | n: blah blah blah blah blah 393 | p: simpsons/101.png 394 | Old Jewish Man + Manjula Nahasapeemapetilon 395 | n: blah blah 396 | c: Number One, Opal, Otto Mann 397 | Number One 398 | l: 1999/9/29- 399 | n: blah blah blah blah 400 | p: simpsons/224.png 401 | Opal 402 | l: 2002/5/25- 403 | n: blah blah blah blah 404 | p: simpsons/116.png 405 | Otto Mann 406 | l: 2004/7/28- 407 | n: blah blah blah blah 408 | p: simpsons/209.png 409 | Lindsey Naegle 410 | l: 1953/9/7- 411 | n: blah blah blah blah blah 412 | p: simpsons/106.png 413 | MacArthur Parker + Lindsey Naegle 414 | n: blah blah blah blah 415 | c: Patches 416 | MacArthur Parker 417 | p: simpsons/53.png 418 | Patches 419 | l: 1980/10/21- 420 | n: blah blah blah blah 421 | p: simpsons/75.png 422 | Patches + Lois Pennycandy 423 | n: blah blah blah blah 424 | Lois Pennycandy 425 | p: simpsons/58.png 426 | l: March 10, 1981- 427 | Lindsey Naegle + Phillips 428 | n: blah blah blah blah 429 | Phillips + ? 430 | c: Plopper 431 | Phillips 432 | p: simpsons/51.png 433 | l: November 25, 19??- 434 | Plopper 435 | l: 1982/11/25- 436 | n: blah blah blah blah 437 | p: simpsons/136.png 438 | Plopper + Brunella Pommelhorst 439 | n: blah blah blah blah 440 | Brunella Pommelhorst 441 | p: simpsons/211.png 442 | l: May 5, 1986- 443 | n: blah blah blah blah 444 | Poochie + Ruth Powers 445 | c: Janey Powell, Martha Prince, Martin Prince, Martin Prince Sr., Principal Dondelinger 446 | Ruth Powers 447 | p: simpsons/174.png 448 | Janey Powell 449 | p: simpsons/73.png 450 | Poochie 451 | p: simpsons/7.png 452 | Martha Prince 453 | p: simpsons/56.png 454 | Principal Dondelinger 455 | p: simpsons/171.png 456 | l: 1952/6/29- 457 | n: blah blah blah blah 458 | J. Loren Pryor + Janey Powell 459 | c: Corporal Punishment, Arnie Pye, Pyro, Freddy Quimby 460 | Corporal Punishment 461 | p: simpsons/249.png 462 | Arnie Pye 463 | p: simpsons/283.png 464 | Corporal Punishment + Joe Quimby 465 | c: Martha Quimby, Radioactive Man (character) 466 | Martha Quimby 467 | p: simpsons/5.png 468 | Arnie Pye + Raphael 469 | c: Rasputin the Friendly Russian, Rex Banner 470 | Raphael 471 | p: simpsons/134.png 472 | Pyro + Francine Rhenquist 473 | c: The Rich Texan 474 | Pyro 475 | p: simpsons/31.png 476 | Freddy Quimby + Richard 477 | c: Roy, Luigi Risotto 478 | Martha Prince + Nick Riviera 479 | c: "Russ Cargill", Sam (barfly), Gerald Samson 480 | "Russ Cargill" 481 | p: simpsons/59.png 482 | Gerald Samson 483 | p: simpsons/136.png 484 | "Russ Cargill" + Ms. Samson#2 485 | c: Hank Scorpio, Arnold Schwarzenegger 486 | Hank Scorpio 487 | p: simpsons/283.png 488 | Ms. Samson#2 489 | p: simpsons/227.png 490 | Sam (barfly) + Scratchy 491 | c: Serak the Preparer, Shary Bobbins 492 | Shauna Chalmers 493 | p: simpsons/129.png 494 | Gerald Samson + Shelby 495 | c: Sherri Mackleberry 496 | Jay Sherman + Martin Prince 497 | c: Dave Shutton, Mindy Simmons, Agnes Skinner, Llewellyn Sinclair 498 | Dave Shutton 499 | p: simpsons/178.png 500 | Agnes Skinner 501 | p: simpsons/56.png 502 | Mindy Simmons 503 | p: simpsons/271.png 504 | Llewellyn Sinclair 505 | p: simpsons/24.png 506 | Dave Shutton + Smilin' Joe Fission 507 | Mindy Simmons + Waylon Smithers Jr. 508 | c: Roy Snyder 509 | Waylon Smithers Jr. 510 | p: simpsons/256.png 511 | Bomb Disarming Robot + Martin Prince Sr. 512 | c: Jebediah Springfield, Miss Springfield, Brandine Spuckler 513 | Martin Prince Sr. 514 | p: simpsons/220.png 515 | Brandine Spuckler 516 | p: simpsons/18.png 517 | Jebediah Springfield + Cletus Spuckler 518 | c: Mary Spuckler, Dolph Starbeam 519 | Mary Spuckler 520 | p: simpsons/100.png 521 | Miss Springfield + Lucius Sweet 522 | c: Shauna Chalmers, Drederick Tatum 523 | Drederick Tatum 524 | p: simpsons/254.png 525 | Lucius Sweet 526 | p: simpsons/274.png 527 | Principal Dondelinger + Allison Taylor 528 | n: blah blah blah blah blah blah 529 | c: Mr. Teeny, Lenny Leonard, Terri Mackleberry 530 | Mr. Teeny 531 | l: 1977/7/1- 532 | n: blah blah blah 533 | p: simpsons/119.png 534 | Mr. Teeny + Cecil Terwilliger 535 | Cecil Terwilliger 536 | p: simpsons/114.png 537 | Lenny Leonard 538 | l: 1979/7/8- 539 | n: blah blah blah 540 | p: simpsons/235.png 541 | Terri Mackleberry 542 | l: 23 Mehr, 1985- 543 | n: blah blah blah 544 | p: simpsons/105.png 545 | Francesca Terwilliger + Terri Mackleberry 546 | n: blah blah blah blah blah blah 547 | Gino Terwilliger + Johnny Tightlips 548 | c: Timothy Lovejoy Jr., Francesca Terwilliger 549 | Johnny Tightlips 550 | p: simpsons/203.png 551 | Gino Terwilliger 552 | p: simpsons/28.png 553 | Francesca Terwilliger 554 | p: simpsons/281.png 555 | Timothy Lovejoy Jr. + Tina Ballerina 556 | c: Titania 557 | Timothy Lovejoy Jr. 558 | p: simpsons/45.png 559 | Tina Ballerina 560 | p: simpsons/210.png 561 | Allison Taylor 562 | l: 1943/9/1- 563 | n: blah blah blah 564 | p: simpsons/150.png 565 | Toshiro + Ugolin 566 | c: Kirk Van Houten, Mr. Vanderbilt, Allison Taylor, Mrs. Vanderbilt, Dr. Velimirovic, Gina Vendetti 567 | Mr. Vanderbilt 568 | p: simpsons/135.png 569 | Kirk Van Houten 570 | p: simpsons/281.png 571 | Toshiro 572 | p: simpsons/53.png 573 | Ugolin 574 | p: simpsons/31.png 575 | Ian (Very Tall Man) + Kirk Van Houten 576 | c: Veterinarian, Poor Violet, Don Vittorio DiMaggio, The Warden 577 | n: blah 578 | Ian (Very Tall Man) 579 | p: simpsons/285.png 580 | The Warden 581 | l: February 15, 1965- 582 | p: simpsons/17.png 583 | Veterinarian 584 | l: February 26, 1957-2014 585 | p: simpsons/287.png 586 | Kirk Van Houten + Professor Werner von Brawn 587 | c: Alex Whitney, Groundskeeper Willie, Clancy Wiggum 588 | Clancy Wiggum 589 | p: simpsons/41.png 590 | Groundskeeper Willie 591 | p: simpsons/160.png 592 | Alex Whitney 593 | p: simpsons/36.png 594 | Professor Werner von Brawn 595 | p: simpsons/63.png 596 | Veterinarian + Ralph Wiggum 597 | c: Sarah Wiggum, Mr. Winfield, Sylvia Winfield 598 | Ralph Wiggum 599 | p: simpsons/256.png 600 | Sarah Wiggum + Emily Winthrop 601 | c: ?#Baby 1, ?#Baby 2 602 | ?#Baby 1 603 | p: simpsons/210.png 604 | ?#Baby 2 605 | p: simpsons/79.png 606 | Emily Winthrop 607 | p: simpsons/4.png 608 | Sarah Wiggum 609 | p: simpsons/298.png 610 | Poor Violet + Greta Wolfcastle 611 | c: Rainier Wolfcastle, Medicine Woman 612 | Don Vittorio DiMaggio + Yellow Weasel 613 | Don Vittorio DiMaggio 614 | p: simpsons/240.png 615 | The Warden + The Yes Guy 616 | c: Artie Ziff, Üter Zörker 617 | The Yes Guy 618 | p: simpsons/113.png 619 | Artie Ziff 620 | p: simpsons/131.png 621 | Üter Zörker 622 | p: simpsons/142.png 623 | Mr. Vanderbilt + Kearney Zzyzwicz 624 | c: Kearney Zzyzwicz Jr., Mona Simpson, Herbert Powell, Abbie Simpson 625 | Mona Simpson 626 | p: simpsons/174.png 627 | Herbert Powell 628 | p: simpsons/183.png 629 | Abbie Simpson 630 | p: simpsons/272.png 631 | Mrs. Vanderbilt + Picard Simpson 632 | c: Kirk Simpson, Dulcine Simpson, Eckhardt Simpson, Gabby Crouse, Winifred Running Goat 633 | Mrs. Vanderbilt 634 | p: simpsons/16.png 635 | Dr. Velimirovic + Yuma Hickman 636 | c: Hortense Simpson, Hubert Simpson 637 | Gina Vendetti + Hugo Simpson I 638 | c: Humphrey Little Goat, Hurt Leg Simpson Relative, Jane Nervous Goat 639 | Hugo Simpson I 640 | p: simpsons/181.png 641 | Gina Vendetti 642 | p: simpsons/156.png 643 | Humphrey Little Goat 644 | p: simpsons/254.png 645 | Hurt Leg Simpson Relative 646 | p: simpsons/221.png 647 | Jane Nervous Goat 648 | p: simpsons/61.png 649 | Humphrey Little Goat + Jenda Simpson 650 | Jenda Simpson 651 | p: simpsons/93.png 652 | -------------------------------------------------------------------------------- /family.js: -------------------------------------------------------------------------------- 1 | /* -*- mode: javascript; js-indent-level: 2 -*- */ 2 | 'use strict'; 3 | 4 | // Override these settings: 5 | var familyDataFilename = "simpsons-family.txt"; // Your own family.txt 6 | var defaultRootName = 'Leopold'; // Someone in your family 7 | var lineHeight = 280; // 220 is better, but the Simpsons pngs are very vertical 8 | 9 | // Other rendering constants 10 | var paddingAmount = 8; 11 | var photoDir = 'photos/'; // should end with slash 12 | 13 | // Rendering settings that user can change 14 | var includeAll = false; 15 | // 1: ancestors + siblings; 2: ancestor + cousins; Infinity: all blood relatives 16 | var downLimit = Infinity; 17 | var rootName = defaultRootName; 18 | 19 | // Stateful global helpers 20 | var imageTracker = { 21 | numCreated: 0, 22 | numDone: 0, 23 | allCreated: false}; 24 | 25 | // Basic parsing functions taking a string as input 26 | function isPerson(name) { 27 | return !name.includes(' + '); 28 | } 29 | function isUnion(name) { 30 | return name.includes(' + '); 31 | } 32 | 33 | // Input: text from familyDataFilename 34 | // Output: "entries" = map 35 | function getEntries(text) { 36 | var lines = text.split('\n'); 37 | var result = {}; 38 | var i = 0; 39 | 40 | var uniqueCounter = 0; // To replace ? by unique identifiers. 41 | function makeUnique(str) { 42 | uniqueCounter += 1; 43 | return str + '#' + uniqueCounter; 44 | } 45 | let correctedLabel = str => 46 | (str == "?" || str == "...") ? makeUnique(str) : str; 47 | 48 | // skip line if comment or blank. return true iff it was a comment or blank. 49 | function trySkipComment() { 50 | if (i >= lines.length 51 | || !(lines[i].startsWith('#') || lines[i].trim() === "")) 52 | return false; 53 | i++; 54 | return true; 55 | } 56 | while (i < lines.length) { 57 | if (trySkipComment()) continue; 58 | var key = lines[i]; 59 | var toks = key.split(' + '); 60 | if (toks.length > 2) { 61 | throw "Multiple + signs in union: " + key; 62 | } 63 | toks = toks.map(x => x.trim()); 64 | if (toks.includes("")) 65 | throw "Misformatted line " + i + ": " + key; 66 | if (key.includes(",")) 67 | throw "Names can't contain commas: " + key; 68 | if (toks.length == 2) { 69 | // need to update name of union with ? so it can be referenced later 70 | toks = toks.map(correctedLabel); 71 | key = toks[0] + ' + ' + toks[1]; 72 | } else { 73 | if (result.hasOwnProperty(key)) 74 | throw "Multiple entries for name: " + key; 75 | } 76 | var value = []; 77 | i += 1; 78 | while (i < lines.length && lines[i].startsWith(' ')) { 79 | if (trySkipComment()) continue; 80 | let trimmedLine = lines[i].trim(); 81 | // should be "X: ..." where X is a limited set of characters 82 | // n: note. l: lifespan. c: children. p: picture. 83 | if (trimmedLine.substr(1, 2) != ": " 84 | || isPerson(key) && !["n", "l", "p"].includes(trimmedLine[0]) 85 | || isUnion(key) && !["n", "c"].includes(trimmedLine[0])) { 86 | throw "Misformatted line under " + key + ": " + trimmedLine; 87 | } 88 | if (trimmedLine.substr(0, 3) == "c: ") { 89 | let children = trimmedLine.substr(3).split(", ").map(correctedLabel); 90 | trimmedLine = "c: " + children.join(", "); 91 | if (children.includes(toks[0])) 92 | throw toks[0] + " is listed as their own child"; 93 | if (children.includes(toks[1])) 94 | throw toks[1] + " is listed as their own child"; 95 | } 96 | value.push(trimmedLine); 97 | i += 1; 98 | } 99 | result[key] = value; 100 | } 101 | return result; 102 | } 103 | 104 | // Rewrite as undirected bipartite graph on people and unions 105 | // Output: map> 106 | function getNeighbours(entries) { 107 | var result = {}; 108 | // Ensure singleton nodes are included: 109 | for (let name of Object.keys(entries)) result[name] = []; 110 | 111 | function addHalfEdge(x, y) { 112 | if (!result.hasOwnProperty(x)) result[x] = []; 113 | result[x].push(y); 114 | } 115 | for (let [name, props] of Object.entries(entries)) { 116 | if (isPerson(name)) continue; 117 | var [p1, p2] = name.split(' + '); 118 | var newName = p1 + ' + ' + p2; 119 | var children = []; 120 | for (var prop of props) { 121 | if (prop.startsWith('c: ')) 122 | children = prop.substring(3).split(', '); 123 | } 124 | for (var x of children.concat([p1, p2])) { 125 | addHalfEdge(newName, x); 126 | addHalfEdge(x, newName); 127 | } 128 | } 129 | return result; 130 | } 131 | 132 | // Get union where this person was one of the two parents, or null if none. 133 | // 0: left side, 1: right side 134 | function getUnion(person, neighbours, side) { 135 | var result = []; 136 | for (let name of neighbours[person]) { 137 | var members = name.split(' + '); 138 | if (members[1 - side]==person) result.push(name); 139 | } 140 | if (result.length===0) return null; 141 | else if (result.length==1) return result[0]; 142 | else throw (person + ' has two unions on side ' + side); 143 | } 144 | 145 | function getLeftUnion(person, neighbours) { 146 | return getUnion(person, neighbours, 0); 147 | } 148 | 149 | function getRightUnion(person, neighbours) { 150 | return getUnion(person, neighbours, 1); 151 | } 152 | 153 | function getAboveUnion(person, neighbours) { 154 | for (let name of neighbours[person]) { 155 | if (!name.split(' + ').includes(person)) 156 | return name; 157 | } 158 | return null; 159 | } 160 | 161 | function getChildren(union, neighbours) { 162 | if (union===null) return []; 163 | return neighbours[union].filter( 164 | name => !union.split(' + ').includes(name)); 165 | } 166 | 167 | // A layout is a map 168 | // Here x is in pixels and y is in "generations" (lineHeight high each) 169 | 170 | // Update layout in-place 171 | function shift(layout, delta, sign=1) { 172 | var [dx, dy] = [delta.x, delta.y]; // avoid aliasing if delta is from layout 173 | function move(point) { 174 | point.x += sign*dx; 175 | point.y += sign*dy; 176 | } 177 | for (var pt of Object.values(layout)) move(pt); 178 | } 179 | 180 | // Use "visibility" instead of "display" b/c sizes still exist 181 | function showDiv(div, displayMode=false) { 182 | if (displayMode) { 183 | div.style.display = "block"; 184 | } else { 185 | div.style.visibility = ""; 186 | } 187 | } 188 | 189 | function hideDiv(div, displayMode=false) { 190 | if (displayMode) { 191 | div.style.display = "none"; 192 | } else { 193 | div.style.visibility = "hidden"; 194 | } 195 | } 196 | 197 | // How much space is needed from the center of this person/union to either side? 198 | function xRadius(name, divs) { 199 | if (isUnion(name)) return 0; 200 | return paddingAmount + divs[name].offsetWidth/2; 201 | } 202 | 203 | // Returns map 204 | function rowRanges(layout, divs) { 205 | var result = {}; 206 | for (var [name, pt] of Object.entries(layout)) { 207 | var delta = xRadius(name, divs); 208 | var isOld = result.hasOwnProperty(pt.y); 209 | result[pt.y] = { 210 | min: Math.min(...[pt.x - delta].concat( 211 | isOld ? [result[pt.y].min] : [])), 212 | max: Math.max(...[pt.x + delta].concat( 213 | isOld ? [result[pt.y].max] : []))}; 214 | } 215 | return result; 216 | } 217 | 218 | // Do Layouts left and right collide? 219 | function collides(left, right, divs) { 220 | var layers = {}; 221 | for (var [name, pt] of 222 | Object.entries(left).concat(Object.entries(right))) { 223 | if (!layers.hasOwnProperty(pt.y)) 224 | layers[pt.y] = []; 225 | layers[pt.y].push([ 226 | pt.x - xRadius(name, divs), 227 | pt.x + xRadius(name, divs)]); 228 | } 229 | for (var [_, intervals] of Object.entries(layers)) { 230 | var sorted = intervals.sort( 231 | (a, b) => a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]); 232 | for (var i = 0; i < sorted.length - 1; i++) { 233 | if (sorted[i][1] > sorted[i+1][0]) return true; 234 | } 235 | } 236 | return false; 237 | } 238 | 239 | // If tryUnder, we'll try both layouts as-is. 240 | // Otherwise move left or right layout to fit side-by-side. 241 | function mergedLayout(left, right, divs, moveRight=true, tryUnder=false) { 242 | if (tryUnder && !collides(left, right, divs)) { 243 | return Object.assign(left, right); 244 | } 245 | var lbounds = rowRanges(left, divs); 246 | var rbounds = rowRanges(right, divs); 247 | var shiftage = null; 248 | for (var y of Object.keys(lbounds)) { 249 | if (rbounds.hasOwnProperty(y)) { 250 | var delta = lbounds[y].max-rbounds[y].min; 251 | shiftage = shiftage===null ? delta : Math.max(shiftage, delta); 252 | } 253 | } 254 | if (shiftage===null) throw "merge without common y"; 255 | if (moveRight) shift(right, {x: shiftage, y: 0}); 256 | else shift(left, {x: -shiftage, y: 0}); 257 | return Object.assign(left, right); 258 | } 259 | 260 | Set.prototype.union = function(setB) { 261 | var union = new Set(this); 262 | for (var elem of setB) { 263 | union.add(elem); 264 | } 265 | return union; 266 | }; 267 | 268 | // returns a Set of all nodes that should be rendered 269 | function getVisibleNodes( 270 | name, pred, neighbours, 271 | path = {allowUp: true, downsLeft: downLimit, desc: true}) { 272 | if (includeAll) { 273 | return new Set(Object.keys(neighbours)); 274 | } 275 | let getNodes = function(newName, newPath) { 276 | if (newName === null || newName == pred) return new Set([]); 277 | return getVisibleNodes(newName, name, neighbours, 278 | Object.assign({}, path, newPath)); 279 | }; 280 | if (isPerson(name)) { 281 | let leftUnion = getLeftUnion(name, neighbours); 282 | let rightUnion = getRightUnion(name, neighbours); 283 | let aboveUnion = path.allowUp ? getAboveUnion(name, neighbours) : null; 284 | return new Set([name]). 285 | union(getNodes(aboveUnion, {desc: false})). 286 | union(getNodes(leftUnion, {allowUp: false})). 287 | union(getNodes(rightUnion, {allowUp: false})); 288 | } else { // name is a union 289 | let [leftParent, rightParent] = name.split(' + '); 290 | let children = (!path.desc && path.downsLeft === 0) 291 | ? [] : getChildren(name, neighbours); 292 | let result = new Set([name]). 293 | union(getNodes(leftParent, {})). 294 | union(getNodes(rightParent, {})); 295 | for (let child of children) { 296 | result = result.union(getNodes( 297 | child, 298 | {allowUp: false, downsLeft: path.downsLeft - 1})); 299 | } 300 | return result; 301 | } 302 | } 303 | 304 | // returns a Layout including name, pred, and nothing beyond pred from name 305 | // name will be at (0, 0) 306 | function dumbLayout(name, pred, neighbours, divs, visibleNodes) { 307 | // Return recursive layout with name at 0, 0 308 | // If next==pred, return doubleton Layout w/ next/pred at defaultLocation 309 | // (though side layouts don't need a defaultLocation due to merge shifting) 310 | let doLayout = function(next, defaultLocation = {x:0, y:0}) { 311 | if (next === null || !visibleNodes.has(next)) return null; 312 | if (next == pred) return {[name]: {x:0, y:0}, [next]: defaultLocation}; 313 | let result = dumbLayout(next, name, neighbours, divs, visibleNodes); 314 | shift(result, result[name], -1); 315 | return result; 316 | }; 317 | 318 | // Central layout to merge into and its default value. It is the return value. 319 | var mainLayout = {[name]: {x:0, y:0}}; 320 | var leftLayout, rightLayout; // These are merged into mainLayout. 321 | if (isPerson(name)) { 322 | let leftUnion = getLeftUnion(name, neighbours); 323 | let rightUnion = getRightUnion(name, neighbours); 324 | let aboveUnion = getAboveUnion(name, neighbours); 325 | leftLayout = doLayout(leftUnion); 326 | rightLayout = doLayout(rightUnion); 327 | let aboveLayout = doLayout(aboveUnion, {x:0, y:-1}); // -1 is up 328 | if (aboveLayout !== null) mainLayout = aboveLayout; 329 | } else { // name is a union 330 | // If union is visible, so are the members of it, but maybe not all children 331 | let [leftParent, rightParent] = name.split(' + '); 332 | let children = getChildren(name, neighbours) 333 | .filter(x => visibleNodes.has(x)); 334 | leftLayout = doLayout(leftParent); 335 | rightLayout = doLayout(rightParent); 336 | let childLayouts = children.map(child => doLayout(child, {x:0, y:1})); 337 | if (childLayouts.length > 0) { 338 | // remove union and concatenate layouts, center, add union back 339 | for (let childLayout of childLayouts) delete childLayout[name]; 340 | mainLayout = childLayouts[0]; 341 | for (let childLayout of childLayouts.slice(1)) 342 | mainLayout = mergedLayout(mainLayout, childLayout, divs); 343 | var childXs = children.map(child => mainLayout[child].x); 344 | var middle = (Math.min(...childXs) + Math.max(...childXs))/2; 345 | shift(mainLayout, {x:-middle, y:0}); 346 | mainLayout[name] = {x:0, y:0}; 347 | } 348 | } 349 | // common to both cases, merge side layouts into center one. 350 | if (leftLayout !== null) { 351 | delete leftLayout[name]; 352 | mainLayout = 353 | mergedLayout(leftLayout, mainLayout, divs, false, isPerson(name)); 354 | } 355 | if (rightLayout !== null) { 356 | delete rightLayout[name]; 357 | mainLayout = 358 | mergedLayout(mainLayout, rightLayout, divs, true, isPerson(name)); 359 | } 360 | return mainLayout; 361 | } 362 | 363 | function boundingBox(layout, divs) { 364 | function xbound(entry, sign) { 365 | var [name, pt] = entry; 366 | return pt.x + ( 367 | isUnion(name) ? 0 : sign*( 368 | paddingAmount + divs[name].offsetWidth/2)); 369 | } 370 | return {bottomLeft: { 371 | x: Math.min(...Object.entries(layout).map(entry=>xbound(entry, -1))), 372 | y: Math.min(...Object.values(layout).map(pt=>pt.y))}, 373 | topRight: { 374 | x: Math.max(...Object.entries(layout).map( 375 | entry=>xbound(entry, +1))), 376 | y: Math.max(...Object.values(layout).map(pt=>pt.y))}}; 377 | } 378 | 379 | function adjustUnions(neighbours, layout, divs) { 380 | for (var node of Object.keys(layout)) { 381 | if (!isUnion(node)) continue; 382 | var children = getRenderedChildren(node, neighbours, layout); 383 | if (children.length === 0) continue; 384 | var [p1, p2] = node.split(' + '); 385 | var parentBottom = Math.max(layout[p1].y + divs[p1].offsetHeight/2, 386 | layout[p2].y + divs[p2].offsetHeight/2); 387 | var childTop = layout[children[0]].y - divs[children[0]].offsetHeight/2; 388 | for (var child of children) { 389 | childTop = Math.min( 390 | childTop, layout[child].y - divs[child].offsetHeight/2); 391 | } 392 | if (childTop < parentBottom) { 393 | errorOut("Union " + node 394 | + " overlapped above/below. Try increasing lineHeight"); 395 | } 396 | layout[node].y = (parentBottom + childTop) / 2; 397 | } 398 | } 399 | 400 | function computeLayout(neighbours, divs) { 401 | var visibleNodes = getVisibleNodes(rootName, null, neighbours); 402 | var layout = dumbLayout(rootName, null, neighbours, divs, visibleNodes); 403 | shift(layout, boundingBox(layout, divs).bottomLeft, -1); 404 | // Don't go into corner. 405 | shift(layout, {x:0, y:1}); 406 | for (var pt of Object.values(layout)) { 407 | pt.y *= lineHeight; 408 | } 409 | adjustUnions(neighbours, layout, divs); 410 | return layout; 411 | } 412 | 413 | function displayName(name) { 414 | return name.replace(/#.*$/g, ''); 415 | } 416 | 417 | function photoLoadCallback() { 418 | imageTracker.numDone++; 419 | imageLoadNotify(); 420 | } 421 | 422 | function makeDiv(name, entries, neighbours) { 423 | var result = document.createElement("div"); 424 | var rawName = name; 425 | result.onclick = function() {changeRoot(rawName);}; 426 | result.className = "label"; 427 | var lines = displayName(name).replace('-', '\u2011').split(" "); 428 | var nameDiv = document.createElement("div"); 429 | for (var i = 0; i < lines.length; i++) { 430 | if (i > 0) nameDiv.appendChild(document.createElement("br")); 431 | nameDiv.appendChild(document.createTextNode(lines[i])); 432 | } 433 | result.appendChild(nameDiv); 434 | var lifespanDiv = null; 435 | var photoDiv = null; 436 | var info = []; 437 | if (entries[name]) { 438 | for (var data of entries[name]) { 439 | if (data.startsWith("l: ")) { 440 | lifespanDiv = document.createElement("div"); 441 | var [birth, death] = data.substring(3).split('-'); 442 | if (birth !== "") { 443 | lifespanDiv.appendChild(document.createTextNode( 444 | birth + (death === '' ? '\u2013' : ''))); 445 | } 446 | if (birth !== "" && death !== "") { 447 | lifespanDiv.appendChild(document.createElement("br")); 448 | } 449 | if (death !== "") { 450 | lifespanDiv.appendChild(document.createTextNode( 451 | '\u2013' + death)); 452 | } 453 | lifespanDiv.className = "lifespan"; 454 | } 455 | if (data.startsWith("p: ")) { 456 | photoDiv = document.createElement("img"); 457 | imageTracker.numCreated++; 458 | photoDiv.onload = photoDiv.onerror = photoLoadCallback; 459 | photoDiv.src = photoDir + data.substring(3); 460 | photoDiv.style.width = "70px"; 461 | photoDiv = document.createElement("div").appendChild(photoDiv); 462 | } 463 | if (data.startsWith("n: ")) { 464 | info.push(data.substring(3)); 465 | } 466 | } 467 | } 468 | function addMarriageInfo(partner, union) { 469 | var result = ""; 470 | for (var data of entries[union]) { 471 | if (data.startsWith("n: ")) { 472 | result += data.substring(3); 473 | } 474 | } 475 | if (result.length === 0) return; 476 | info.push('With ' + displayName(partner) + ": " + result); 477 | } 478 | var leftUnion = getLeftUnion(name, neighbours); 479 | if (leftUnion !== null) 480 | addMarriageInfo(leftUnion.split(' + ')[0], leftUnion); 481 | var rightUnion = getRightUnion(name, neighbours); 482 | if (rightUnion !== null) 483 | addMarriageInfo(rightUnion.split(' + ')[1], rightUnion); 484 | 485 | if (photoDiv !== null) { 486 | result.appendChild(photoDiv); 487 | } 488 | if (lifespanDiv !== null) { 489 | result.appendChild(lifespanDiv); 490 | } 491 | function makeInfoDiv() { 492 | var result = document.createElement("ul"); 493 | for (var item of info) { 494 | var li = document.createElement("li"); 495 | for (var tok of item.split(/(http[^\s]*(?=(\s|$)))/g)) { 496 | if (tok.startsWith('http')) { 497 | let a = document.createElement("a"); 498 | a.appendChild(document.createTextNode(tok)); 499 | a.href = tok; 500 | a.target = '_blank'; 501 | li.appendChild(a); 502 | } else { 503 | li.appendChild(document.createTextNode(tok)); 504 | } 505 | } 506 | result.appendChild(li); 507 | } 508 | result.classList.add('info'); 509 | return result; 510 | } 511 | if (info.length !== 0) { 512 | result.classList.add('has-info'); 513 | } 514 | result.onmouseover = function() { 515 | document.getElementById('info-pane-name').innerHTML = displayName(name); 516 | var details = document.getElementById('info-pane-details'); 517 | while (details.firstChild) { 518 | details.removeChild(details.firstChild); 519 | } 520 | if (info.length !== 0) { 521 | details.appendChild(makeInfoDiv()); 522 | showDiv(document.getElementById('info-pane'), true); 523 | hideDiv(document.getElementById('info-pane-placeholder'), true); 524 | } else { 525 | hideDiv(document.getElementById('info-pane'), true); 526 | showDiv(document.getElementById('info-pane-placeholder'), true); 527 | } 528 | }; 529 | // For some reason size changes if not on-screen. 530 | document.body.appendChild(result); 531 | result.style.top = "200px"; 532 | result.style.left = "200px"; 533 | hideDiv(result); 534 | return result; 535 | } 536 | 537 | // name -> div 538 | function makeDivs(entries, neighbours) { 539 | var result = {}; 540 | for (var name of Object.keys(neighbours)) { 541 | if (isPerson(name)) { 542 | result[name] = makeDiv(name, entries, neighbours); 543 | } 544 | } 545 | imageTracker.allCreated = true; 546 | return result; 547 | } 548 | 549 | function placeDiv(div, x, y) { 550 | showDiv(div); 551 | div.style.top = (y - div.offsetHeight/2)+'px'; 552 | div.style.left = (x - div.offsetWidth/2)+'px'; 553 | } 554 | 555 | // https://stackoverflow.com/questions/4270485/drawing-lines-on-html-page 556 | function createLine(x1, y1, x2, y2, lineClass) { 557 | function createLineElement(x, y, length, angle) { 558 | var line = document.createElement("div"); 559 | var styles = 'border-style: solid; ' 560 | + 'width: ' + length + 'px; ' 561 | + 'height: 0px; ' 562 | + '-moz-transform: rotate(' + angle + 'rad); ' 563 | + '-webkit-transform: rotate(' + angle + 'rad); ' 564 | + '-o-transform: rotate(' + angle + 'rad); ' 565 | + '-ms-transform: rotate(' + angle + 'rad); ' 566 | + 'position: absolute; ' 567 | + 'top: ' + y + 'px; ' 568 | + 'left: ' + x + 'px; '; 569 | line.setAttribute('style', styles); 570 | line.classList.add('drawn-line'); 571 | line.classList.add(lineClass); 572 | return line; 573 | } 574 | 575 | var a = x1 - x2, 576 | b = y1 - y2, 577 | c = Math.sqrt(a * a + b * b); 578 | var sx = (x1 + x2) / 2, 579 | sy = (y1 + y2) / 2; 580 | var x = sx - c / 2, 581 | y = sy; 582 | var alpha = Math.PI - Math.atan2(-b, a); 583 | return createLineElement(x, y, c, alpha); 584 | } 585 | 586 | function drawLine(p, q, lineClass) { 587 | document.body.appendChild(createLine(p.x, p.y, q.x, q.y, lineClass)); 588 | } 589 | 590 | function getRenderedChildren(union, neighbours, layout) { 591 | var result = []; 592 | var children = getChildren(union, neighbours); 593 | for (var child of children) { 594 | if (layout.hasOwnProperty(child)) result.push(child); 595 | } 596 | return result; 597 | } 598 | 599 | function hasRenderedChildren(union, neighbours, layout) { 600 | return getRenderedChildren(union, neighbours, layout).length > 0; 601 | } 602 | 603 | function connect(node1, node2, layout, neighbours, divs, lineClass) { 604 | var [person, union] = isPerson(node1) ? [node1, node2] : [node2, node1]; 605 | if (union.split(' + ').includes(person)) { 606 | // Connect person with union to a partner 607 | if (hasRenderedChildren(union, neighbours, layout)) { 608 | // Line from bottom of person 609 | var fudgeFixBelowParent = 4; 610 | drawLine({x:layout[person].x, 611 | y:layout[person].y + divs[person].offsetHeight/2 612 | - fudgeFixBelowParent}, 613 | {x:layout[union].x, 614 | y:layout[union].y}, lineClass); 615 | } else { 616 | // Line from side of person 617 | var isLeftPersonOfUnion = union.split(' + ')[0] == person; 618 | drawLine({x:layout[person].x 619 | + (isLeftPersonOfUnion ? 1 : -1) 620 | * divs[person].offsetWidth/2, 621 | y:layout[person].y}, 622 | {x:layout[union].x, 623 | y:layout[union].y}, lineClass); 624 | } 625 | } else { 626 | // Connect person with union to a parent 627 | // Line from top of person 628 | drawLine({x:layout[person].x, 629 | y:layout[person].y - divs[person].offsetHeight/2}, 630 | {x:layout[union].x, 631 | y:layout[union].y}, lineClass); 632 | } 633 | } 634 | 635 | function scrollToElement(element) { 636 | const elementRect = element.getBoundingClientRect(); 637 | const elementMiddleY = window.pageYOffset + elementRect.top 638 | + element.offsetHeight / 2; 639 | const y = elementMiddleY - (window.innerHeight / 2); 640 | const elementMiddleX = window.pageXOffset + elementRect.left 641 | + element.offsetWidth / 2; 642 | const x = elementMiddleX - (window.innerWidth / 2); 643 | window.scrollTo(x, 644 | y - document.getElementById('control-panel').offsetHeight/2); 645 | element.focus(); 646 | } 647 | 648 | function traverse(name, pred, neighbours, divs, layout, mode, 649 | flags = {ancestor: true, descendant: true, blood: true}) { 650 | var posClass; 651 | if (pred === null) { 652 | posClass = "pos-root"; 653 | } else if (flags.ancestor) { 654 | posClass = "pos-ancestor"; 655 | } else if (flags.descendant) { 656 | posClass = "pos-descendant"; 657 | } else if (flags.blood) { 658 | posClass = "pos-blood"; 659 | } else { 660 | posClass = "pos-other"; 661 | } 662 | if (mode=="drawConnections" 663 | && layout.hasOwnProperty(name) && layout.hasOwnProperty(pred)) { 664 | if (isUnion(name) && name.split(' + ').includes(pred) 665 | && getRenderedChildren(name, neighbours, layout).length === 0) { 666 | // Avoid half-colored links 667 | connect(name, pred, layout, neighbours, divs, "pos-other"); 668 | } else { 669 | connect(name, pred, layout, neighbours, divs, posClass); 670 | } 671 | } 672 | function recur(newName, newFlags) { 673 | if (newName === null || newName == pred) return; 674 | traverse(newName, name, neighbours, divs, layout, mode, 675 | Object.assign({}, flags, newFlags)); 676 | } 677 | if (isPerson(name)) { 678 | if (mode=="setPeopleClasses") { 679 | divs[name].classList.add(posClass); 680 | } 681 | var leftUnion = getLeftUnion(name, neighbours); 682 | recur(leftUnion, {ancestor: false, blood: flags.ancestor || flags.blood}); 683 | var rightUnion = getRightUnion(name, neighbours); 684 | recur(rightUnion, {ancestor: false, blood: flags.ancestor || flags.blood}); 685 | var aboveUnion = getAboveUnion(name, neighbours); 686 | recur(aboveUnion, {blood: false, descendant: false}); 687 | } else { 688 | var [p1, p2] = name.split(' + '); 689 | recur(p1, {blood: false, descendant: false}); 690 | recur(p2, {blood: false, descendant: false}); 691 | for (var child of getChildren(name, neighbours)) { 692 | recur(child, {ancestor: false, blood: flags.ancestor || flags.blood}); 693 | } 694 | } 695 | } 696 | 697 | function setPeopleClasses(rootName, neighbours, divs) { 698 | traverse(rootName, null, neighbours, divs, null, "setPeopleClasses"); 699 | } 700 | 701 | function drawConnections(rootName, neighbours, divs, layout) { 702 | traverse(rootName, null, neighbours, divs, layout, "drawConnections"); 703 | } 704 | 705 | function drawTree(divs, neighbours) { 706 | if (!divs[rootName]) 707 | throw "Selected name not found in data: " + rootName; 708 | // Since classes affect div size, do it before layout. 709 | setPeopleClasses(rootName, neighbours, divs); 710 | var layout = computeLayout(neighbours, divs); 711 | var box = boundingBox(layout, divs); 712 | shift(layout, {x:0, 713 | y:0.5*lineHeight 714 | - box.bottomLeft.y 715 | + document.getElementById('control-panel').offsetHeight}); 716 | drawConnections(rootName, neighbours, divs, layout); 717 | for (let name of Object.keys(neighbours)) { 718 | if (isPerson(name)) { 719 | if (layout.hasOwnProperty(name)) { 720 | placeDiv(divs[name], layout[name].x, layout[name].y); 721 | } else { 722 | hideDiv(divs[name]); 723 | // Stuck divs would make window always stay giant. 724 | divs[name].style.top = '100px'; 725 | divs[name].style.left = '100px'; 726 | } 727 | } 728 | } 729 | scrollToElement(divs[rootName]); 730 | updateTreeInformation(layout, divs); 731 | } 732 | 733 | function updateTreeInformation(layout, divs) { 734 | var infodiv = document.getElementById('tree-information'); 735 | var ancestors = 0, descendants = 0, blood = 0, others = 0; 736 | for (var [person, div] of Object.entries(divs)) { 737 | if (!layout.hasOwnProperty(person)) continue; 738 | if (div.classList.contains('pos-ancestor')) ancestors++; 739 | if (div.classList.contains('pos-descendant')) descendants++; 740 | if (div.classList.contains('pos-blood')) blood++; 741 | if (div.classList.contains('pos-other')) others++; 742 | } 743 | var counts = []; 744 | function process(number, description, textClass) { 745 | if (number > 0) 746 | counts.push('' 747 | + number + " " + description 748 | + ""); 749 | } 750 | process(descendants, "descendants", "text-descendant"); 751 | process(ancestors, "ancestors", "text-ancestor"); 752 | process(blood, "blood relatives", "text-blood"); 753 | process(others, "others", "text-other"); 754 | var result = 'Showing '; 755 | for (var i=0; i 1) { 818 | let msg = "Multiple connected components"; 819 | for (let [name, component] of components) { 820 | msg += " | " 821 | + Object.keys(component).length + " connected to " + name; 822 | } 823 | throw msg; 824 | } 825 | } 826 | 827 | function errorOut(error) { 828 | console.log(error); 829 | alert(error); 830 | throw error; 831 | } 832 | 833 | function asyncLoadTextFile(filename, successCallback) { 834 | var xhr = new XMLHttpRequest(); 835 | xhr.open("GET", filename, true); 836 | xhr.onload = function (e) { 837 | if (xhr.readyState === 4 && xhr.status === 200) { 838 | try { 839 | successCallback(xhr.responseText.replace(/\r/g, '')); 840 | } catch (error) { 841 | errorOut(error); 842 | } 843 | } else { 844 | errorOut(xhr.statusText); 845 | } 846 | }; 847 | xhr.onerror = errorOut; 848 | xhr.send(); 849 | } 850 | 851 | window.onload = function() { 852 | asyncLoadTextFile(familyDataFilename, processFamilyTxt); 853 | }; 854 | 855 | function processFamilyTxt(family_txt) { 856 | var entries = getEntries(family_txt); 857 | var neighbours = getNeighbours(entries); 858 | validateTreeStructure(neighbours); 859 | var divs = makeDivs(entries, neighbours); 860 | // Need to save divs and neighbours, also keep entries for debugging. 861 | window.state = {entries, divs, neighbours}; 862 | 863 | readHash(); 864 | drawTree(divs, neighbours); 865 | window.onpopstate = function() { 866 | readHash(); 867 | redraw(); 868 | }; 869 | } 870 | 871 | function imageLoadNotify() { 872 | if (imageTracker.allCreated 873 | && imageTracker.numDone == imageTracker.numCreated) { 874 | redraw(); 875 | } 876 | } 877 | 878 | function redraw() { 879 | for (var div of Array.from(document.getElementsByClassName('drawn-line'))) { 880 | div.parentNode.removeChild(div); 881 | } 882 | for (var kind of ["root", "ancestor", "blood", "descendant", "other"]) { 883 | for (var el of Array.from( 884 | document.getElementsByClassName("pos-"+kind))) { 885 | el.classList.remove("pos-"+kind); 886 | } 887 | } 888 | drawTree(window.state.divs, window.state.neighbours); 889 | updateHash(); 890 | } 891 | 892 | function changeRoot(person) { 893 | rootName = person; 894 | showRootName(); 895 | redraw(); 896 | } 897 | 898 | function updateHash() { 899 | window.location.hash = '#' + encodeURIComponent(rootName) 900 | + ':' + document.getElementById('detail-picker').value; 901 | } 902 | 903 | function showRootName() { 904 | document.title = displayName(rootName) + "'s Family Tree"; 905 | document.getElementById('root-name').innerText = displayName(rootName); 906 | } 907 | 908 | function readHash() { 909 | if (window.location.hash.startsWith('#')) { 910 | var [name, detail] = window.location.hash.substr(1).split(':'); 911 | rootName = decodeURIComponent(name); 912 | document.getElementById('detail-picker').value = detail; 913 | } 914 | setVarsFromDetailOption(); 915 | showRootName(); 916 | } 917 | --------------------------------------------------------------------------------