diff --git a/trailer.html b/trailer.html
index cfc788d..3d25567 100644
--- a/trailer.html
+++ b/trailer.html
@@ -1424,12 +1424,26 @@
// through seventy cards to find one.
function hasScenes(shots) { return shots.length > 8 && shots.filter(function (x) { return x.scene; }).length > shots.length / 2; }
function sceneKey(s) { return String(s.place || s.scene || s.setting || "").toLowerCase().replace(/^(int|ext)\.?\s*\/?\s*(int|ext)?\.?\s*/, "").replace(/\s*[-–—]\s*(day|night|dawn|dusk|morning|evening|afternoon|late afternoon|continuous|the storm|the tornado).*$/, "").replace(/[^a-z0-9]+/g, " ").trim(); }
+ // Two keys name one place when one begins with the other ("farmyard",
+ // "farmyard gravel drive"). And a scene that cuts between the kitchen and
+ // the doorstep is ONE scene: a place that comes back within two groups
+ // folds everything since into itself.
+ function samePlace(a, b) { return a === b || (a && b && (a.indexOf(b) === 0 || b.indexOf(a) === 0)); }
function sceneGroups(shots) {
- var groups = [], cur = null;
+ var groups = [];
shots.forEach(function (s) {
- var k = sceneKey(s);
- if (!cur || cur.key !== k) { cur = { key: k, name: s.scene || s.setting || k, shots: [] }; groups.push(cur); }
- cur.shots.push(s);
+ var k = sceneKey(s), cur = groups[groups.length - 1];
+ if (cur && samePlace(cur.key, k)) { cur.shots.push(s); return; }
+ for (var back = 2; back <= 3; back++) {
+ var g = groups[groups.length - back];
+ if (g && samePlace(g.key, k)) {
+ var merged = groups.splice(groups.length - back + 1);
+ merged.forEach(function (m) { g.shots = g.shots.concat(m.shots); if (g.name.indexOf(m.name) < 0) g.name += " / " + m.name; });
+ g.shots.push(s);
+ return;
+ }
+ }
+ groups.push({ key: k, name: s.scene || s.setting || k, shots: [s] });
});
return groups;
}