-
Notifications
You must be signed in to change notification settings - Fork 0
/
speed-bot.html
158 lines (136 loc) · 5.07 KB
/
speed-bot.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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
<p>
<select id="indexEntries"></select> <!-- Select control -->
<button onclick=dostart(event)>start</button>
<span id=startat></span>
</p>
<pre id="result"></pre>
<script type="module">
import {visit,getfrom,sitemaps} from './telling.js'
import {open, context} from 'http://code.fed.wiki/assets/v1/frame.js'
const asSlug = (title) => title.replace(/\s/g, '-').replace(/[^A-Za-z0-9-]/g, '').toLowerCase()
const any = list => list[Math.floor(Math.random()*list.length)]
const hsv = hue => `"${(hue%1).toFixed(3)} 0.2 1.0"`
const quote = title => `"${title.replace(/ +/g,'\\n')}"`
let done = Date.now() + 10000
let all = [await getfrom('a',['wiki.ralfbarkow.ch'])]
let reference = (await context()).page.story.find(item => item.type == 'reference')
if(reference) {
all = [await getfrom(reference.slug,[reference.site])]
}
window.startat.innerText = all[0].page.title
let pick = all[0]
let seen = new Set([pick.page.title])
let dot = []
let hue = 0.5001
let color = {} // site => hsv
addcolor(pick)
populateIndexEntries(seen)
function addcolor(pick) {
let title = pick.page.title
let site = pick.site
let sites = pick.sites
color[site] ||= hsv(hue += 0.111)
dot.push(`${quote(title)} [ tooltip="${site}\n\n${sites.join("\n")}" fillcolor=${color[site]}]`)
}
function populateIndexEntries(seen) {
console.log("populateIndexEntries(seen) reached")
let indexEntries = seen
let select = document.getElementById('indexEntries')
// Clear existing options
select.innerHTML = '';
indexEntries.forEach(entry => {
let option = document.createElement('option')
option.text = entry
select.add(option)
})
console.log(indexEntries)
}
function setStartEntry() {
const select = document.getElementById('indexEntries');
const selectedEntry = select.value;
console.log('Selected Entry:', selectedEntry);
// Find the selected entry in the `seen` Set
for (let entry of seen) {
if (entry === selectedEntry) {
// Update the start entry and display it
window.startat.innerText = entry;
console.log('Start Entry:', entry);
break;
}
}
}
// Attach the setStartEntry function to the change event of the select element
document.getElementById('indexEntries').addEventListener('change', setStartEntry);
window.doview = function (event) {
let [site,title] = event.target.innerText.split(' — ')
window.parent.postMessage({
action:"doInternalLink",
title,
site,
keepLineup: event.shiftKey
}, "*")
}
window.dostart = async function (event) {
done = Date.now() + 10000
window.result.innerText = ''
// all = [all[0]]
// pick = all[0]
// Check if a start entry is selected
const selectedStartEntry = document.getElementById('indexEntries').value;
if (selectedStartEntry) {
// Set the start entry based on the selected entry
pick = all.find(entry => entry.page.title === selectedStartEntry);
} else {
// Use the default start entry
pick = all[0];
}
seen = new Set([pick.page.title])
dot = []
hue = 0.5001
color = {} // site => hsv
addcolor(pick)
console.log('Start: pick.page', pick.page);
try {
while (Date.now() < done) {
let remain = Math.ceil((done - Date.now())/1000);
let paragraphs = pick.page.story.filter(item => item.type === 'paragraph');
console.log('Paragraphs: ', paragraphs);
for (let paragraph of paragraphs) {
let links = visit(pick.page).filter(title => !seen.has(title))
if (links.length) {
let link = any(links)
seen.add(link)
populateIndexEntries(seen)
let next = await getfrom(asSlug(link),pick.sites)
if (next && next.page) {
addcolor(next)
dot.push(`${quote(pick.page.title)} -> ${quote(next.page.title)}`)
all.push(next)
window.result.innerHTML += `${remain} <span onclick=doview(event)>${next.site} — ${link}</span>\n`
pick = next
} else {
window.result.innerHTML += ` <span style="color:gray;">fail ${link}</span>\n`
// pick = any(all) // can't find page for link
}
} else {
all = all.filter(place => !(place.site == pick.site && place.page.title == pick.page.title))
if (!all.length) break
window.result.innerHTML += ` <span style="color:gray;">done ${pick.page.title}</span>\n`
pick = any(all) // can't find new link on page
}
}
}}
catch(err) {
window.result.innerHTML += `
${err.message}
${err.stack}`
}
window.result.innerHTML += "\n\n"+Object.entries(sitemaps).map(([site,infos]) => `${infos.length} — ${site}`).join("\n")
let text = `digraph {\nnode [shape=box style=filled fillcolor=white]\n${dot.join("\n")}\n}`
let story = [
{type:'paragraph', text: `Random journey rooted from ${reference.title} and proceeding for ${all.length} pages travelling through ${Object.keys(color).length} sites.`},
{type:'graphviz', text}
]
open({title:"Speed Bot Journey",story},event.shiftKey,Object.keys(color))
}
</script></body></html>