Skip to content

Commit afe033d

Browse files
committed
pretty cool!
1 parent 8ee4c93 commit afe033d

File tree

6 files changed

+156
-136
lines changed

6 files changed

+156
-136
lines changed

src/App.svelte

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,7 @@
55
import { getGeoEntriesInBounds, getUniqueByGeoHash } from "./lib/geodata";
66
import { Mixin } from "leaflet";
77
8-
let markers = [
9-
{
10-
lat: 51.508056,
11-
lon: -0.076111,
12-
name: "City with a very very long name",
13-
type: "city",
14-
pageTitle: "London",
15-
sizeClass: "full",
16-
},
17-
{
18-
lat: 48.8566,
19-
lon: 2.3522,
20-
name: "Paris",
21-
type: "landmark",
22-
pageTitle: "Paris",
23-
sizeClass: "full",
24-
isSelected: true,
25-
},
26-
{
27-
lat: 40.7128,
28-
lon: -74.006,
29-
name: "New York",
30-
type: "city",
31-
pageTitle: "New York City",
32-
sizeClass: "full",
33-
},
34-
];
8+
let markers = [];
359
3610
let dataStatus = "not started";
3711
let mapBounds = {
@@ -73,9 +47,40 @@
7347
zoom: Math.max(13, mapZoom), // Ensure zoom is at least 13
7448
};
7549
76-
openWikiPane(marker.pageTitle);
50+
openWikiPane(marker.page_title);
7751
}
7852
53+
function addCosmeticsToEntries(entries, hashlevel) {
54+
if (hashlevel > 7.5) {
55+
for (const entry of entries) {
56+
entry.sizeClass = "full";
57+
}
58+
} else {
59+
for (const entry of entries) {
60+
entry.sizeClass = "dot";
61+
}
62+
for (const entry of getUniqueByGeoHash({
63+
entries,
64+
hashLength: hashlevel - 0.5,
65+
scoreField: "page_len",
66+
})) {
67+
entry.sizeClass = "reduced";
68+
}
69+
for (const entry of getUniqueByGeoHash({
70+
entries,
71+
hashLength: hashlevel - 1.5,
72+
scoreField: "page_len",
73+
})) {
74+
entry.sizeClass = "full";
75+
}
76+
}
77+
// Sort entries so "full" size class appears last
78+
entries.sort((a, b) => {
79+
if (a.sizeClass === "full" && b.sizeClass !== "full") return 1;
80+
if (a.sizeClass !== "full" && b.sizeClass === "full") return -1;
81+
return 0;
82+
});
83+
}
7984
async function handleBoundsChange(event) {
8085
const center = event.detail.center;
8186
mapZoom = event.detail.zoom;
@@ -88,12 +93,16 @@
8893
maxLon: event.detail.bounds._northEast.lng,
8994
};
9095
const entries = await getGeoEntriesInBounds(bounds);
96+
console.log(mapZoom, Math.max(1, Math.min(8, mapZoom / 2)));
97+
const hashlevel = Math.max(1, Math.min(8, mapZoom / 2));
9198
const uniqueEntries = getUniqueByGeoHash({
9299
entries,
93-
hashLength: Math.min(8, mapZoom / 2),
100+
hashLength: hashlevel,
94101
scoreField: "page_len",
95102
});
103+
addCosmeticsToEntries(uniqueEntries, hashlevel);
96104
console.log("Unique entries:", uniqueEntries);
105+
markers = uniqueEntries;
97106
}
98107
onMount(async () => {
99108
console.log("App starting");
@@ -120,7 +129,7 @@
120129
on:markerclick={handleMarkerClick}
121130
/>
122131

123-
<SlidingPane bind:isOpen={isPaneOpen} title={wikiPage} pageTitle={wikiPage}>
132+
<SlidingPane bind:isOpen={isPaneOpen} title={wikiPage} page_title={wikiPage}>
124133
<!-- Content will be handled by the iframe in SlidingPane -->
125134
</SlidingPane>
126135
</main>

src/lib/Map.svelte

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
let mapElement;
1717
let map;
1818
let markerLayer;
19-
19+
let startZoom = 0;
2020
// Use the traditional event dispatcher
2121
const dispatch = createEventDispatcher();
2222
@@ -44,15 +44,26 @@
4444
mountain: "mountain-snow",
4545
other: "pin",
4646
railwaystation: "train-front",
47-
river: "river",
47+
river: "waves",
4848
school: "school",
4949
settlement: "city",
5050
town: "city",
5151
village: "city",
5252
waterbody: "waves",
5353
};
54-
const icon = iconByType[marker.type] || iconByType.other;
55-
54+
const icon = iconByType[marker.category] || iconByType.other;
55+
const unsanitized_page_title = marker.page_title.replaceAll("_", " ");
56+
let label = marker.name;
57+
if (!marker.name) {
58+
label = unsanitized_page_title;
59+
} else if (unsanitized_page_title.includes(marker.name)) {
60+
label = unsanitized_page_title;
61+
} else {
62+
const fullLabel = marker.name + " - " + unsanitized_page_title;
63+
if (fullLabel.length <= 30) {
64+
label = fullLabel;
65+
}
66+
}
5667
return `
5768
<div class="map-marker marker-size-${marker.sizeClass} ${
5869
marker.isSelected ? "marker-selected" : ""
@@ -61,10 +72,8 @@
6172
<img src="/icons/${icon}.svg">
6273
</div>
6374
<div class="marker-text-container">
64-
<div class="marker-text marker-text-outline">${
65-
marker.name || marker.page
66-
}</div>
67-
<div class="marker-text">${marker.name || marker.page}</div>
75+
<div class="marker-text marker-text-outline">${label}</div>
76+
<div class="marker-text">${label}</div>
6877
</div>
6978
</div>
7079
`;
@@ -115,6 +124,10 @@
115124
116125
function flyTo(targetLocation) {
117126
const { lat, lon, zoom: targetZoom } = targetLocation;
127+
// If target zoom is less than current zoom, clear markers first
128+
if (targetZoom < map.getZoom()) {
129+
markerLayer.clearLayers();
130+
}
118131
isFlying = true;
119132
map.flyTo([lat, lon], targetZoom, {
120133
animate: true,

src/lib/SlidingPane.svelte

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// Props
66
export let isOpen = false;
77
export let title = "";
8-
export let pageTitle = ""; // Wikipedia page name
8+
export let page_title = ""; // Wikipedia page name
99
export let width = "400px"; // Default width for desktop
1010
export let height = "70vh"; // Default height for mobile
1111
@@ -37,15 +37,15 @@
3737
}
3838
3939
// Generate Wikipedia URL
40-
$: wikiUrl = pageTitle
40+
$: wikiUrl = page_title
4141
? isMobile || parseInt(actualWidth) < 768
42-
? `https://en.m.wikipedia.org/wiki/${encodeURIComponent(pageTitle)}`
43-
: `https://en.wikipedia.org/wiki/${encodeURIComponent(pageTitle)}`
42+
? `https://en.m.wikipedia.org/wiki/${encodeURIComponent(page_title)}`
43+
: `https://en.wikipedia.org/wiki/${encodeURIComponent(page_title)}`
4444
: "about:blank";
4545
4646
// Open in new tab
4747
function openInNewTab() {
48-
if (pageTitle) {
48+
if (page_title) {
4949
window.open(wikiUrl, "_blank");
5050
}
5151
}
@@ -94,7 +94,7 @@
9494
>
9595
<SlidingPaneHeader
9696
{title}
97-
{pageTitle}
97+
{page_title}
9898
{expanded}
9999
{isMobile}
100100
onClose={close}
@@ -103,7 +103,7 @@
103103
/>
104104

105105
<div class="pane-content">
106-
{#if pageTitle}
106+
{#if page_title}
107107
<iframe
108108
title="Wikipedia Content"
109109
src={wikiUrl}

0 commit comments

Comments
 (0)