wiki 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +1 -0
  7. data/lib/wiki.rb +2 -0
  8. data/lib/wiki/ReadMe.md +89 -0
  9. data/lib/wiki/config.ru +2 -0
  10. data/lib/wiki/favicon.rb +31 -0
  11. data/lib/wiki/page.rb +74 -0
  12. data/lib/wiki/random_id.rb +5 -0
  13. data/lib/wiki/server.rb +336 -0
  14. data/lib/wiki/server_helpers.rb +66 -0
  15. data/lib/wiki/stores/ReadMe.md +26 -0
  16. data/lib/wiki/stores/all.rb +3 -0
  17. data/lib/wiki/stores/couch.rb +121 -0
  18. data/lib/wiki/stores/file.rb +53 -0
  19. data/lib/wiki/stores/store.rb +38 -0
  20. data/lib/wiki/version.rb +3 -0
  21. data/lib/wiki/views/client/Gruntfile.js +50 -0
  22. data/lib/wiki/views/client/ReadMe.md +67 -0
  23. data/lib/wiki/views/client/build-test.bat +10 -0
  24. data/lib/wiki/views/client/build.bat +8 -0
  25. data/lib/wiki/views/client/builder.pl +41 -0
  26. data/lib/wiki/views/client/client.coffee +3 -0
  27. data/lib/wiki/views/client/client.js +3607 -0
  28. data/lib/wiki/views/client/crosses.png +0 -0
  29. data/lib/wiki/views/client/images/external-link-ltr-icon.png +0 -0
  30. data/lib/wiki/views/client/images/noise.png +0 -0
  31. data/lib/wiki/views/client/images/oops.jpg +0 -0
  32. data/lib/wiki/views/client/js/d3/d3.behavior.js +198 -0
  33. data/lib/wiki/views/client/js/d3/d3.chart.js +984 -0
  34. data/lib/wiki/views/client/js/d3/d3.csv.js +92 -0
  35. data/lib/wiki/views/client/js/d3/d3.geo.js +566 -0
  36. data/lib/wiki/views/client/js/d3/d3.geom.js +825 -0
  37. data/lib/wiki/views/client/js/d3/d3.js +3597 -0
  38. data/lib/wiki/views/client/js/d3/d3.layout.js +1923 -0
  39. data/lib/wiki/views/client/js/d3/d3.time.js +660 -0
  40. data/lib/wiki/views/client/js/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  41. data/lib/wiki/views/client/js/images/ui-icons_222222_256x240.png +0 -0
  42. data/lib/wiki/views/client/js/jquery-1.6.2.min.js +18 -0
  43. data/lib/wiki/views/client/js/jquery-1.7.1.min.js +4 -0
  44. data/lib/wiki/views/client/js/jquery-1.9.1.min.js +5 -0
  45. data/lib/wiki/views/client/js/jquery-migrate-1.1.1.min.js +3 -0
  46. data/lib/wiki/views/client/js/jquery-ui-1.10.1.custom.min.css +5 -0
  47. data/lib/wiki/views/client/js/jquery-ui-1.10.1.custom.min.js +6 -0
  48. data/lib/wiki/views/client/js/jquery-ui-1.8.16.custom.css +339 -0
  49. data/lib/wiki/views/client/js/jquery-ui-1.8.16.custom.min.js +315 -0
  50. data/lib/wiki/views/client/js/jquery.ie.cors.js +310 -0
  51. data/lib/wiki/views/client/js/jquery.ui.touch-punch.min.js +11 -0
  52. data/lib/wiki/views/client/js/modernizr.custom.63710.js +824 -0
  53. data/lib/wiki/views/client/js/sockjs-0.3.min.js +27 -0
  54. data/lib/wiki/views/client/js/underscore-min.js +30 -0
  55. data/lib/wiki/views/client/mkplugin.sh +97 -0
  56. data/lib/wiki/views/client/package.json +36 -0
  57. data/lib/wiki/views/client/runtests.html +26 -0
  58. data/lib/wiki/views/client/style.css +339 -0
  59. data/lib/wiki/views/client/test/mocha.css +231 -0
  60. data/lib/wiki/views/client/test/mocha.js +5340 -0
  61. data/lib/wiki/views/client/test/testclient.js +17133 -0
  62. data/lib/wiki/views/client/testclient.coffee +18 -0
  63. data/lib/wiki/views/client/theme/granite.css +59 -0
  64. data/lib/wiki/views/client/theme/stoneSeamless.jpg +0 -0
  65. data/lib/wiki/views/client/twitter-maintainance.jpg +0 -0
  66. data/lib/wiki/views/layout.haml +56 -0
  67. data/lib/wiki/views/oops.haml +5 -0
  68. data/lib/wiki/views/page.haml +20 -0
  69. data/lib/wiki/views/static.html +30 -0
  70. data/lib/wiki/views/view.haml +2 -0
  71. data/wiki.gemspec +28 -0
  72. metadata +121 -0
@@ -0,0 +1,92 @@
1
+ (function(){d3.csv = function(url, callback) {
2
+ d3.text(url, "text/csv", function(text) {
3
+ callback(text && d3.csv.parse(text));
4
+ });
5
+ };
6
+ d3.csv.parse = function(text) {
7
+ var header;
8
+ return d3.csv.parseRows(text, function(row, i) {
9
+ if (i) {
10
+ var o = {}, j = -1, m = header.length;
11
+ while (++j < m) o[header[j]] = row[j];
12
+ return o;
13
+ } else {
14
+ header = row;
15
+ return null;
16
+ }
17
+ });
18
+ };
19
+
20
+ d3.csv.parseRows = function(text, f) {
21
+ var EOL = {}, // sentinel value for end-of-line
22
+ EOF = {}, // sentinel value for end-of-file
23
+ rows = [], // output rows
24
+ re = /\r\n|[,\r\n]/g, // field separator regex
25
+ n = 0, // the current line number
26
+ t, // the current token
27
+ eol; // is the current token followed by EOL?
28
+
29
+ re.lastIndex = 0; // work-around bug in FF 3.6
30
+
31
+ /** @private Returns the next token. */
32
+ function token() {
33
+ if (re.lastIndex >= text.length) return EOF; // special case: end of file
34
+ if (eol) { eol = false; return EOL; } // special case: end of line
35
+
36
+ // special case: quotes
37
+ var j = re.lastIndex;
38
+ if (text.charCodeAt(j) === 34) {
39
+ var i = j;
40
+ while (i++ < text.length) {
41
+ if (text.charCodeAt(i) === 34) {
42
+ if (text.charCodeAt(i + 1) !== 34) break;
43
+ i++;
44
+ }
45
+ }
46
+ re.lastIndex = i + 2;
47
+ var c = text.charCodeAt(i + 1);
48
+ if (c === 13) {
49
+ eol = true;
50
+ if (text.charCodeAt(i + 2) === 10) re.lastIndex++;
51
+ } else if (c === 10) {
52
+ eol = true;
53
+ }
54
+ return text.substring(j + 1, i).replace(/""/g, "\"");
55
+ }
56
+
57
+ // common case
58
+ var m = re.exec(text);
59
+ if (m) {
60
+ eol = m[0].charCodeAt(0) !== 44;
61
+ return text.substring(j, m.index);
62
+ }
63
+ re.lastIndex = text.length;
64
+ return text.substring(j);
65
+ }
66
+
67
+ while ((t = token()) !== EOF) {
68
+ var a = [];
69
+ while ((t !== EOL) && (t !== EOF)) {
70
+ a.push(t);
71
+ t = token();
72
+ }
73
+ if (f && !(a = f(a, n++))) continue;
74
+ rows.push(a);
75
+ }
76
+
77
+ return rows;
78
+ };
79
+ d3.csv.format = function(rows) {
80
+ return rows.map(d3_csv_formatRow).join("\n");
81
+ };
82
+
83
+ function d3_csv_formatRow(row) {
84
+ return row.map(d3_csv_formatValue).join(",");
85
+ }
86
+
87
+ function d3_csv_formatValue(text) {
88
+ return /[",\n]/.test(text)
89
+ ? "\"" + text.replace(/\"/g, "\"\"") + "\""
90
+ : text;
91
+ }
92
+ })();
@@ -0,0 +1,566 @@
1
+ (function(){d3.geo = {};
2
+ // TODO clip input coordinates on opposite hemisphere
3
+ d3.geo.azimuthal = function() {
4
+ var mode = "orthographic", // or stereographic
5
+ origin,
6
+ scale = 200,
7
+ translate = [480, 250],
8
+ x0,
9
+ y0,
10
+ cy0,
11
+ sy0;
12
+
13
+ function azimuthal(coordinates) {
14
+ var x1 = coordinates[0] * d3_radians - x0,
15
+ y1 = coordinates[1] * d3_radians,
16
+ cx1 = Math.cos(x1),
17
+ sx1 = Math.sin(x1),
18
+ cy1 = Math.cos(y1),
19
+ sy1 = Math.sin(y1),
20
+ k = mode == "stereographic" ? 1 / (1 + sy0 * sy1 + cy0 * cy1 * cx1) : 1,
21
+ x = k * cy1 * sx1,
22
+ y = k * (sy0 * cy1 * cx1 - cy0 * sy1);
23
+ return [
24
+ scale * x + translate[0],
25
+ scale * y + translate[1]
26
+ ];
27
+ }
28
+
29
+ azimuthal.mode = function(x) {
30
+ if (!arguments.length) return mode;
31
+ mode = x;
32
+ return azimuthal;
33
+ };
34
+
35
+ azimuthal.origin = function(x) {
36
+ if (!arguments.length) return origin;
37
+ origin = x;
38
+ x0 = origin[0] * d3_radians;
39
+ y0 = origin[1] * d3_radians;
40
+ cy0 = Math.cos(y0);
41
+ sy0 = Math.sin(y0);
42
+ return azimuthal;
43
+ };
44
+
45
+ azimuthal.scale = function(x) {
46
+ if (!arguments.length) return scale;
47
+ scale = +x;
48
+ return azimuthal;
49
+ };
50
+
51
+ azimuthal.translate = function(x) {
52
+ if (!arguments.length) return translate;
53
+ translate = [+x[0], +x[1]];
54
+ return azimuthal;
55
+ };
56
+
57
+ return azimuthal.origin([0, 0]);
58
+ };
59
+ // Derived from Tom Carden's Albers implementation for Protovis.
60
+ // http://gist.github.com/476238
61
+ // http://mathworld.wolfram.com/AlbersEqual-AreaConicProjection.html
62
+
63
+ d3.geo.albers = function() {
64
+ var origin = [-98, 38],
65
+ parallels = [29.5, 45.5],
66
+ scale = 1000,
67
+ translate = [480, 250],
68
+ lng0, // d3_radians * origin[0]
69
+ n,
70
+ C,
71
+ p0;
72
+
73
+ function albers(coordinates) {
74
+ var t = n * (d3_radians * coordinates[0] - lng0),
75
+ p = Math.sqrt(C - 2 * n * Math.sin(d3_radians * coordinates[1])) / n;
76
+ return [
77
+ scale * p * Math.sin(t) + translate[0],
78
+ scale * (p * Math.cos(t) - p0) + translate[1]
79
+ ];
80
+ }
81
+
82
+ function reload() {
83
+ var phi1 = d3_radians * parallels[0],
84
+ phi2 = d3_radians * parallels[1],
85
+ lat0 = d3_radians * origin[1],
86
+ s = Math.sin(phi1),
87
+ c = Math.cos(phi1);
88
+ lng0 = d3_radians * origin[0];
89
+ n = .5 * (s + Math.sin(phi2));
90
+ C = c * c + 2 * n * s;
91
+ p0 = Math.sqrt(C - 2 * n * Math.sin(lat0)) / n;
92
+ return albers;
93
+ }
94
+
95
+ albers.origin = function(x) {
96
+ if (!arguments.length) return origin;
97
+ origin = [+x[0], +x[1]];
98
+ return reload();
99
+ };
100
+
101
+ albers.parallels = function(x) {
102
+ if (!arguments.length) return parallels;
103
+ parallels = [+x[0], +x[1]];
104
+ return reload();
105
+ };
106
+
107
+ albers.scale = function(x) {
108
+ if (!arguments.length) return scale;
109
+ scale = +x;
110
+ return albers;
111
+ };
112
+
113
+ albers.translate = function(x) {
114
+ if (!arguments.length) return translate;
115
+ translate = [+x[0], +x[1]];
116
+ return albers;
117
+ };
118
+
119
+ return reload();
120
+ };
121
+
122
+ // A composite projection for the United States, 960x500. The set of standard
123
+ // parallels for each region comes from USGS, which is published here:
124
+ // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
125
+ // TODO allow the composite projection to be rescaled?
126
+ d3.geo.albersUsa = function() {
127
+ var lower48 = d3.geo.albers();
128
+
129
+ var alaska = d3.geo.albers()
130
+ .origin([-160, 60])
131
+ .parallels([55, 65]);
132
+
133
+ var hawaii = d3.geo.albers()
134
+ .origin([-160, 20])
135
+ .parallels([8, 18]);
136
+
137
+ var puertoRico = d3.geo.albers()
138
+ .origin([-60, 10])
139
+ .parallels([8, 18]);
140
+
141
+ function albersUsa(coordinates) {
142
+ var lon = coordinates[0],
143
+ lat = coordinates[1];
144
+ return (lat < 25
145
+ ? (lon < -100 ? hawaii : puertoRico)
146
+ : (lat > 50 ? alaska : lower48))(coordinates);
147
+ }
148
+
149
+ albersUsa.scale = function(x) {
150
+ if (!arguments.length) return lower48.scale();
151
+ lower48.scale(x);
152
+ alaska.scale(x * .6);
153
+ hawaii.scale(x);
154
+ puertoRico.scale(x * 1.5);
155
+ return albersUsa.translate(lower48.translate());
156
+ };
157
+
158
+ albersUsa.translate = function(x) {
159
+ if (!arguments.length) return lower48.translate();
160
+ var dz = lower48.scale() / 1000,
161
+ dx = x[0],
162
+ dy = x[1];
163
+ lower48.translate(x);
164
+ alaska.translate([dx - 400 * dz, dy + 170 * dz]);
165
+ hawaii.translate([dx - 190 * dz, dy + 200 * dz]);
166
+ puertoRico.translate([dx + 580 * dz, dy + 430 * dz]);
167
+ return albersUsa;
168
+ };
169
+
170
+ return albersUsa.scale(lower48.scale());
171
+ };
172
+
173
+ var d3_radians = Math.PI / 180;
174
+ d3.geo.mercator = function() {
175
+ var scale = 500,
176
+ translate = [480, 250];
177
+
178
+ function mercator(coordinates) {
179
+ var x = (coordinates[0]) / 360,
180
+ y = (-180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + coordinates[1] * Math.PI / 360))) / 360;
181
+ return [
182
+ scale * x + translate[0],
183
+ scale * Math.max(-.5, Math.min(.5, y)) + translate[1]
184
+ ];
185
+ }
186
+
187
+ mercator.scale = function(x) {
188
+ if (!arguments.length) return scale;
189
+ scale = +x;
190
+ return mercator;
191
+ };
192
+
193
+ mercator.translate = function(x) {
194
+ if (!arguments.length) return translate;
195
+ translate = [+x[0], +x[1]];
196
+ return mercator;
197
+ };
198
+
199
+ return mercator;
200
+ };
201
+ /**
202
+ * Returns a function that, given a GeoJSON object (e.g., a feature), returns
203
+ * the corresponding SVG path. The function can be customized by overriding the
204
+ * projection. Point features are mapped to circles with a default radius of
205
+ * 4.5px; the radius can be specified either as a constant or a function that
206
+ * is evaluated per object.
207
+ */
208
+ d3.geo.path = function() {
209
+ var pointRadius = 4.5,
210
+ pointCircle = d3_path_circle(pointRadius),
211
+ projection = d3.geo.albersUsa();
212
+
213
+ function path(d, i) {
214
+ if (typeof pointRadius === "function") {
215
+ pointCircle = d3_path_circle(pointRadius.apply(this, arguments));
216
+ }
217
+ return d3_geo_pathType(pathTypes, d);
218
+ }
219
+
220
+ function project(coordinates) {
221
+ return projection(coordinates).join(",");
222
+ }
223
+
224
+ var pathTypes = {
225
+
226
+ FeatureCollection: function(f) {
227
+ var path = [],
228
+ features = f.features,
229
+ i = -1, // features.index
230
+ n = features.length;
231
+ while (++i < n) path.push(d3_geo_pathType(pathTypes, features[i].geometry));
232
+ return path.join("");
233
+ },
234
+
235
+ Feature: function(f) {
236
+ return d3_geo_pathType(pathTypes, f.geometry);
237
+ },
238
+
239
+ Point: function(o) {
240
+ return "M" + project(o.coordinates) + pointCircle;
241
+ },
242
+
243
+ MultiPoint: function(o) {
244
+ var path = [],
245
+ coordinates = o.coordinates,
246
+ i = -1, // coordinates.index
247
+ n = coordinates.length;
248
+ while (++i < n) path.push("M", project(coordinates[i]), pointCircle);
249
+ return path.join("");
250
+ },
251
+
252
+ LineString: function(o) {
253
+ var path = ["M"],
254
+ coordinates = o.coordinates,
255
+ i = -1, // coordinates.index
256
+ n = coordinates.length;
257
+ while (++i < n) path.push(project(coordinates[i]), "L");
258
+ path.pop();
259
+ return path.join("");
260
+ },
261
+
262
+ MultiLineString: function(o) {
263
+ var path = [],
264
+ coordinates = o.coordinates,
265
+ i = -1, // coordinates.index
266
+ n = coordinates.length,
267
+ subcoordinates, // coordinates[i]
268
+ j, // subcoordinates.index
269
+ m; // subcoordinates.length
270
+ while (++i < n) {
271
+ subcoordinates = coordinates[i];
272
+ j = -1;
273
+ m = subcoordinates.length;
274
+ path.push("M");
275
+ while (++j < m) path.push(project(subcoordinates[j]), "L");
276
+ path.pop();
277
+ }
278
+ return path.join("");
279
+ },
280
+
281
+ Polygon: function(o) {
282
+ var path = [],
283
+ coordinates = o.coordinates,
284
+ i = -1, // coordinates.index
285
+ n = coordinates.length,
286
+ subcoordinates, // coordinates[i]
287
+ j, // subcoordinates.index
288
+ m; // subcoordinates.length
289
+ while (++i < n) {
290
+ subcoordinates = coordinates[i];
291
+ j = -1;
292
+ m = subcoordinates.length;
293
+ path.push("M");
294
+ while (++j < m) path.push(project(subcoordinates[j]), "L");
295
+ path[path.length - 1] = "Z";
296
+ }
297
+ return path.join("");
298
+ },
299
+
300
+ MultiPolygon: function(o) {
301
+ var path = [],
302
+ coordinates = o.coordinates,
303
+ i = -1, // coordinates index
304
+ n = coordinates.length,
305
+ subcoordinates, // coordinates[i]
306
+ j, // subcoordinates index
307
+ m, // subcoordinates.length
308
+ subsubcoordinates, // subcoordinates[j]
309
+ k, // subsubcoordinates index
310
+ p; // subsubcoordinates.length
311
+ while (++i < n) {
312
+ subcoordinates = coordinates[i];
313
+ j = -1;
314
+ m = subcoordinates.length;
315
+ while (++j < m) {
316
+ subsubcoordinates = subcoordinates[j];
317
+ k = -1;
318
+ p = subsubcoordinates.length - 1;
319
+ path.push("M");
320
+ while (++k < p) path.push(project(subsubcoordinates[k]), "L");
321
+ path[path.length - 1] = "Z";
322
+ }
323
+ }
324
+ return path.join("");
325
+ },
326
+
327
+ GeometryCollection: function(o) {
328
+ var path = [],
329
+ geometries = o.geometries,
330
+ i = -1, // geometries index
331
+ n = geometries.length;
332
+ while (++i < n) path.push(d3_geo_pathType(pathTypes, geometries[i]));
333
+ return path.join("");
334
+ }
335
+
336
+ };
337
+
338
+ var areaTypes = {
339
+
340
+ FeatureCollection: function(f) {
341
+ var area = 0,
342
+ features = f.features,
343
+ i = -1, // features.index
344
+ n = features.length;
345
+ while (++i < n) area += d3_geo_pathType(areaTypes, features[i]);
346
+ return area;
347
+ },
348
+
349
+ Feature: function(f) {
350
+ return d3_geo_pathType(areaTypes, f.geometry);
351
+ },
352
+
353
+ Point: d3_geo_pathZero,
354
+ MultiPoint: d3_geo_pathZero,
355
+ LineString: d3_geo_pathZero,
356
+ MultiLineString: d3_geo_pathZero,
357
+
358
+ Polygon: function(o) {
359
+ return polygonArea(o.coordinates);
360
+ },
361
+
362
+ MultiPolygon: function(o) {
363
+ var sum = 0,
364
+ coordinates = o.coordinates,
365
+ i = -1, // coordinates index
366
+ n = coordinates.length;
367
+ while (++i < n) sum += polygonArea(coordinates[i]);
368
+ return sum;
369
+ },
370
+
371
+ GeometryCollection: function(o) {
372
+ var sum = 0,
373
+ geometries = o.geometries,
374
+ i = -1, // geometries index
375
+ n = geometries.length;
376
+ while (++i < n) sum += d3_geo_pathType(areaTypes, geometries[i]);
377
+ return sum;
378
+ }
379
+
380
+ };
381
+
382
+ function polygonArea(coordinates) {
383
+ var sum = area(coordinates[0]), // exterior ring
384
+ i = 0, // coordinates.index
385
+ n = coordinates.length;
386
+ while (++i < n) sum -= area(coordinates[i]); // holes
387
+ return sum;
388
+ }
389
+
390
+ function polygonCentroid(coordinates) {
391
+ var polygon = d3.geom.polygon(coordinates[0].map(projection)), // exterior ring
392
+ centroid = polygon.centroid(1),
393
+ x = centroid[0],
394
+ y = centroid[1],
395
+ z = Math.abs(polygon.area()),
396
+ i = 0, // coordinates index
397
+ n = coordinates.length;
398
+ while (++i < n) {
399
+ polygon = d3.geom.polygon(coordinates[i].map(projection)); // holes
400
+ centroid = polygon.centroid(1);
401
+ x -= centroid[0];
402
+ y -= centroid[1];
403
+ z -= Math.abs(polygon.area());
404
+ }
405
+ return [x, y, 6 * z]; // weighted centroid
406
+ }
407
+
408
+ var centroidTypes = {
409
+
410
+ // TODO FeatureCollection
411
+ // TODO Point
412
+ // TODO MultiPoint
413
+ // TODO LineString
414
+ // TODO MultiLineString
415
+ // TODO GeometryCollection
416
+
417
+ Feature: function(f) {
418
+ return d3_geo_pathType(centroidTypes, f.geometry);
419
+ },
420
+
421
+ Polygon: function(o) {
422
+ var centroid = polygonCentroid(o.coordinates);
423
+ return [centroid[0] / centroid[2], centroid[1] / centroid[2]];
424
+ },
425
+
426
+ MultiPolygon: function(o) {
427
+ var area = 0,
428
+ coordinates = o.coordinates,
429
+ centroid,
430
+ x = 0,
431
+ y = 0,
432
+ z = 0,
433
+ i = -1, // coordinates index
434
+ n = coordinates.length;
435
+ while (++i < n) {
436
+ centroid = polygonCentroid(coordinates[i]);
437
+ x += centroid[0];
438
+ y += centroid[1];
439
+ z += centroid[2];
440
+ }
441
+ return [x / z, y / z];
442
+ }
443
+
444
+ };
445
+
446
+
447
+ function area(coordinates) {
448
+ return Math.abs(d3.geom.polygon(coordinates.map(projection)).area());
449
+ }
450
+
451
+ path.projection = function(x) {
452
+ projection = x;
453
+ return path;
454
+ };
455
+
456
+ path.area = function(d) {
457
+ return d3_geo_pathType(areaTypes, d);
458
+ };
459
+
460
+ path.centroid = function(d) {
461
+ return d3_geo_pathType(centroidTypes, d);
462
+ };
463
+
464
+ path.pointRadius = function(x) {
465
+ if (typeof x === "function") pointRadius = x;
466
+ else {
467
+ pointRadius = +x;
468
+ pointCircle = d3_path_circle(pointRadius);
469
+ }
470
+ return path;
471
+ };
472
+
473
+ return path;
474
+ };
475
+
476
+ function d3_path_circle(radius) {
477
+ return "m0," + radius
478
+ + "a" + radius + "," + radius + " 0 1,1 0," + (-2 * radius)
479
+ + "a" + radius + "," + radius + " 0 1,1 0," + (+2 * radius)
480
+ + "z";
481
+ }
482
+
483
+ function d3_geo_pathZero() {
484
+ return 0;
485
+ }
486
+
487
+ function d3_geo_pathType(types, o) {
488
+ return o && o.type in types ? types[o.type](o) : "";
489
+ }
490
+ /**
491
+ * Given a GeoJSON object, returns the corresponding bounding box. The bounding
492
+ * box is represented by a two-dimensional array: [[left, bottom], [right,
493
+ * top]], where left is the minimum longitude, bottom is the minimum latitude,
494
+ * right is maximum longitude, and top is the maximum latitude.
495
+ */
496
+ d3.geo.bounds = function(feature) {
497
+ var left = Infinity,
498
+ bottom = Infinity,
499
+ right = -Infinity,
500
+ top = -Infinity;
501
+ d3_geo_bounds(feature, function(x, y) {
502
+ if (x < left) left = x;
503
+ if (x > right) right = x;
504
+ if (y < bottom) bottom = y;
505
+ if (y > top) top = y;
506
+ });
507
+ return [[left, bottom], [right, top]];
508
+ };
509
+
510
+ function d3_geo_bounds(o, f) {
511
+ if (o.type in d3_geo_boundsTypes) d3_geo_boundsTypes[o.type](o, f);
512
+ }
513
+
514
+ var d3_geo_boundsTypes = {
515
+ Feature: d3_geo_boundsFeature,
516
+ FeatureCollection: d3_geo_boundsFeatureCollection,
517
+ LineString: d3_geo_boundsLineString,
518
+ MultiLineString: d3_geo_boundsMultiLineString,
519
+ MultiPoint: d3_geo_boundsLineString,
520
+ MultiPolygon: d3_geo_boundsMultiPolygon,
521
+ Point: d3_geo_boundsPoint,
522
+ Polygon: d3_geo_boundsPolygon
523
+ };
524
+
525
+ function d3_geo_boundsFeature(o, f) {
526
+ d3_geo_bounds(o.geometry, f);
527
+ }
528
+
529
+ function d3_geo_boundsFeatureCollection(o, f) {
530
+ for (var a = o.features, i = 0, n = a.length; i < n; i++) {
531
+ d3_geo_bounds(a[i].geometry, f);
532
+ }
533
+ }
534
+
535
+ function d3_geo_boundsLineString(o, f) {
536
+ for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) {
537
+ f.apply(null, a[i]);
538
+ }
539
+ }
540
+
541
+ function d3_geo_boundsMultiLineString(o, f) {
542
+ for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) {
543
+ for (var b = a[i], j = 0, m = b.length; j < m; j++) {
544
+ f.apply(null, b[j]);
545
+ }
546
+ }
547
+ }
548
+
549
+ function d3_geo_boundsMultiPolygon(o, f) {
550
+ for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) {
551
+ for (var b = a[i][0], j = 0, m = b.length; j < m; j++) {
552
+ f.apply(null, b[j]);
553
+ }
554
+ }
555
+ }
556
+
557
+ function d3_geo_boundsPoint(o, f) {
558
+ f.apply(null, o.coordinates);
559
+ }
560
+
561
+ function d3_geo_boundsPolygon(o, f) {
562
+ for (var a = o.coordinates[0], i = 0, n = a.length; i < n; i++) {
563
+ f.apply(null, a[i]);
564
+ }
565
+ }
566
+ })();