-
Notifications
You must be signed in to change notification settings - Fork 0
/
visited-places.html
115 lines (100 loc) · 3.32 KB
/
visited-places.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<div id=result>working</div>
<style>
body { font-family: Arial, Helvetica, sans-serif; }
h3, span { cursor: pointer; }
</style>
<script>
let infos = []
let categories = {}
let origin
start()
async function start() {
origin = (await requestNeighborhood())[0]
let sitemap = await fetch(`//${origin}/system/sitemap.json`).then(res => res.json())
tally(sitemap)
}
function tally(sitemap) {
infos = sitemap.filter(info => info.synopsis.startsWith('▷'))
result.innerHTML = `${infos.length} place pages`
for (let info of infos) {
let m = info.synopsis.match(/^▷([\w ]+)[\.\,]/)
if (m) {
let tag = m[1]
let cat = categories[tag] ||= []
cat.push(info)
}
}
for (let tag of Object.keys(categories).sort()) {
let cat = categories[tag]
cat.sort((a,b) => a.date - b.date)
result.innerHTML += `<h3 onclick=map(event)>${tag}</h3>${cat.map(info => `<span onclick=show(event)>${info.title}</span>`).join('<br>')}`
}
}
function show(event) {
let title = event.target.innerText
let message = {
action:"doInternalLink",
title,
keepLineup: event.shiftKey
}
window.parent.postMessage(message, "*")
}
async function map(event) {
let category = event.target.innerText
let slugs = categories[category].map(info => info.slug)
let pages = await Promise.all(slugs.map(slug => fetch(`//${origin}/${slug}.json`).then(res => res.json())))
let text = pages.map(center).join("\n")
let html = pages.map(image).join("\n")
let title = `Places Tagged ${category}`
let story = [
{type:'paragraph', text:'We found pages for these places. Update this page from the category on the [[View Places]] page.'},
{type:'map', text},
{type:'html',text:html}
]
open({title,story},event.shiftKey)
}
function center(page) {
let markup = page.story.find(item => item.type == 'map').text
let lat = []
let lon = []
for (let line of markup.split(/\n/)) {
let m = line.match(/^(-?\d+\.\d+), ?(-?\d+\.\d+)/)
if(m) {
lat.push(+m[1])
lon.push(+m[2])
}
}
let n = lat.length
lat = lat.reduce((a,b) => a+b)/n
lon = lon.reduce((a,b) => a+b)/n
return `${lat}, ${lon} [[${page.title}]]`
}
function image(page) {
let markup = page.story.find(item => item.type == 'html').text
let m = markup.match(/src=(.*?)>/)
return `<img width=49% src="${m[1]}">`
}
// U T I L I T I E S
function open(page, keepLineup=false, forks=[]) {
const dup = obj => JSON.parse(JSON.stringify(obj))
let date = Date.now()
for (let item of page.story) item.id = (Math.random()*10**20).toFixed(0)
page.journal = [{type:'create', date, item:dup(page)}, ...forks.map(site => ({type:'fork',date,site}))]
let message = {action: "showResult", page, keepLineup}
window.parent.postMessage(message, "*");
}
function requestNeighborhood() {
return new Promise((resolve, reject) => {
window.addEventListener("message", neighborhood)
function neighborhood({data}) {
if (data.action != "neighborhood") return
window.removeEventListener(
"message", neighborhood)
resolve(data.neighborhood)
}
window.parent.postMessage({
action: "requestNeighborhood"
}, "*")
})
}
</script>