add graph depth config

This commit is contained in:
Jacky Zhao 2021-12-27 13:06:58 -05:00
parent 8fd011ac31
commit 000611b2ea
3 changed files with 28 additions and 6 deletions

View File

@ -1,5 +1,6 @@
enableLegend: false enableLegend: false
enableDrag: true enableDrag: true
enableZoom: true enableZoom: true
depth: -1 # set to -1 to show full graph
paths: paths:
- /moc: "#4388cc" - /moc: "#4388cc"

View File

View File

@ -16,12 +16,35 @@
const content = {{$.Site.Data.contentIndex}} const content = {{$.Site.Data.contentIndex}}
const curPage = {{ strings.TrimRight "/" .Page.RelPermalink }} const curPage = {{ strings.TrimRight "/" .Page.RelPermalink }}
const pathColors = {{$.Site.Data.graphConfig.paths}} const pathColors = {{$.Site.Data.graphConfig.paths}}
let depth = {{$.Site.Data.graphConfig.depth}}
const parseIdsFromLinks = (links) => [...(new Set(links.flatMap(link => ([link.source, link.target]))))] const parseIdsFromLinks = (links) => [...(new Set(links.flatMap(link => ([link.source, link.target]))))]
const neighbours = new Set()
const wl = [curPage || "/", "__SENTINEL"]
if (depth >= 0) {
while (depth >= 0 && wl.length > 0) {
// compute neighbours
const cur = wl.shift()
console.log(depth, cur, wl)
if (cur === "__SENTINEL") {
depth--
wl.push("__SENTINEL")
} else {
neighbours.add(cur)
const outgoing = index.links[cur] || []
const incoming = index.backlinks[cur] || []
console.log(incoming)
wl.push(...outgoing.map(l => l.target), ...incoming.map(l => l.source))
}
}
} else {
parseIdsFromLinks(links).forEach(id => neighbours.add(id))
}
const data = { const data = {
nodes: parseIdsFromLinks(links).map(id => ({id})), nodes: [...neighbours].map(id => ({id})),
links, links: links.filter(l => neighbours.has(l.source) && neighbours.has(l.target)),
} }
const color = (d) => { const color = (d) => {
@ -70,10 +93,8 @@
const width = document.getElementById("graph-container").offsetWidth const width = document.getElementById("graph-container").offsetWidth
const simulation = d3.forceSimulation(data.nodes) const simulation = d3.forceSimulation(data.nodes)
.force("charge", d3.forceManyBody().strength(-20)) .force("charge", d3.forceManyBody().strength(-30))
.force("link", d3.forceLink(data.links) .force("link", d3.forceLink(data.links).id(d => d.id))
.id(d => d.id)
)
.force("center", d3.forceCenter()); .force("center", d3.forceCenter());
const svg = d3.select('#graph-container') const svg = d3.select('#graph-container')