mirror of
https://github.com/tcsenpai/obsidiangarden_netlify.git
synced 2025-06-07 05:05:20 +00:00
single computation for both sidebar page mentions and graph
This commit is contained in:
parent
3bb6041df0
commit
5fcee3da0b
@ -30,47 +30,63 @@ function extractLinks(content) {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getBacklinks(data) {
|
function getGraph(data) {
|
||||||
const notes = data.collections.note;
|
let nodes = {};
|
||||||
if (!notes) {
|
let links = [];
|
||||||
return [];
|
let stemURLs = {};
|
||||||
|
let homeAlias = "/";
|
||||||
|
data.collections.note.forEach((v, idx) => {
|
||||||
|
let fpath = v.filePathStem.replace("/notes/", "");
|
||||||
|
let parts = fpath.split("/");
|
||||||
|
let group = "none";
|
||||||
|
if (parts.length >= 3) {
|
||||||
|
group = parts[parts.length - 2];
|
||||||
|
}
|
||||||
|
nodes[v.url] = {
|
||||||
|
id: idx,
|
||||||
|
title: v.data.title || v.fileSlug,
|
||||||
|
url: v.url,
|
||||||
|
group,
|
||||||
|
home: v.data["dg-home"] || false,
|
||||||
|
outBound: extractLinks(v.template.frontMatter.content),
|
||||||
|
neighbors: new Set(),
|
||||||
|
backLinks: new Set(),
|
||||||
|
};
|
||||||
|
stemURLs[fpath] = v.url;
|
||||||
|
if (v.data["dg-home"]) {
|
||||||
|
homeAlias = v.url;
|
||||||
}
|
}
|
||||||
const currentFileSlug = data.page.filePathStem
|
|
||||||
.replace("/notes/", "")
|
|
||||||
.split("#")[0];
|
|
||||||
const currentURL = data.page.url;
|
|
||||||
|
|
||||||
let backlinks = [];
|
|
||||||
let uniqueLinks = new Set();
|
|
||||||
let counter = 1;
|
|
||||||
|
|
||||||
for (const otherNote of notes) {
|
|
||||||
const noteContent = otherNote.template.frontMatter.content;
|
|
||||||
const backLinks = extractLinks(noteContent);
|
|
||||||
|
|
||||||
if (
|
|
||||||
!uniqueLinks.has(otherNote.url) &&
|
|
||||||
backLinks.some(
|
|
||||||
(link) =>
|
|
||||||
caselessCompare(link, currentFileSlug) ||
|
|
||||||
currentURL == link.split("#")[0]
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
let preview = noteContent.slice(0, 240);
|
|
||||||
backlinks.push({
|
|
||||||
url: otherNote.url,
|
|
||||||
title: otherNote.data.title || otherNote.data.page.fileSlug,
|
|
||||||
preview,
|
|
||||||
id: counter++,
|
|
||||||
isHome: otherNote.data["dg-home"] || false,
|
|
||||||
});
|
});
|
||||||
uniqueLinks.add(otherNote.url);
|
Object.values(nodes).forEach((node) => {
|
||||||
|
let outBound = new Set();
|
||||||
|
node.outBound.forEach((olink) => {
|
||||||
|
let link = (stemURLs[olink] || olink).split("#")[0];
|
||||||
|
outBound.add(link);
|
||||||
|
});
|
||||||
|
node.outBound = Array.from(outBound);
|
||||||
|
node.outBound.forEach((link) => {
|
||||||
|
let n = nodes[link];
|
||||||
|
if (n) {
|
||||||
|
n.neighbors.add(node.url);
|
||||||
|
n.backLinks.add(node.url);
|
||||||
|
node.neighbors.add(n.url);
|
||||||
|
links.push({ source: node.id, target: n.id });
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
return backlinks;
|
});
|
||||||
|
Object.keys(nodes).map((k) => {
|
||||||
|
nodes[k].neighbors = Array.from(nodes[k].neighbors);
|
||||||
|
nodes[k].backLinks = Array.from(nodes[k].backLinks);
|
||||||
|
nodes[k].size = nodes[k].neighbors.length;
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
homeAlias,
|
||||||
|
nodes,
|
||||||
|
links,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.wikiLinkRegex = wikiLinkRegex;
|
exports.wikiLinkRegex = wikiLinkRegex;
|
||||||
exports.internalLinkRegex = internalLinkRegex;
|
exports.internalLinkRegex = internalLinkRegex;
|
||||||
exports.extractLinks = extractLinks;
|
exports.extractLinks = extractLinks;
|
||||||
exports.getBacklinks = getBacklinks;
|
exports.getGraph = getGraph;
|
||||||
|
5
src/site/_data/eleventyComputed.js
Normal file
5
src/site/_data/eleventyComputed.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
const { getGraph } = require("../../helpers/linkUtils");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
graph: (data) => getGraph(data),
|
||||||
|
}
|
@ -102,7 +102,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function fetchGraphData() {
|
function fetchGraphData() {
|
||||||
fetch('/graph').then(res => res.json()).then(data => {
|
fetch('/graph.json').then(res => res.json()).then(data => {
|
||||||
window.graphData = data;
|
window.graphData = data;
|
||||||
Graph = renderGraph(filterToDepth(JSON.parse(JSON.stringify(data))), "link-graph", 330, 330);
|
Graph = renderGraph(filterToDepth(JSON.parse(JSON.stringify(data))), "link-graph", 330, 330);
|
||||||
});
|
});
|
||||||
|
@ -43,26 +43,42 @@
|
|||||||
|
|
||||||
{%endif%}
|
{%endif%}
|
||||||
|
|
||||||
|
{%if settings.dgShowBacklinks === true %}
|
||||||
{%if settings.dgShowBacklinks === true %}
|
{%if settings.dgShowBacklinks === true %}
|
||||||
<div class="backlinks">
|
<div class="backlinks">
|
||||||
<div class="backlink-title" style="margin: 4px 0 !important;">Pages mentioning this page</div>
|
<div class="backlink-title" style="margin: 4px 0 !important;">Pages mentioning this page</div>
|
||||||
<div class="backlink-list">
|
<div class="backlink-list">
|
||||||
|
{%- if page.url == "/" -%}
|
||||||
{%- if backlinks.length === 0 -%}
|
{%- if graph.nodes[graph.homeAlias].backLinks.length === 0 -%}
|
||||||
<div class="backlink-card">
|
<div class="backlink-card">
|
||||||
<span class="no-backlinks-message">No other pages mentions this page</span>
|
<span class="no-backlinks-message">No other pages mentions this page</span>
|
||||||
</div>
|
</div>
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
|
{%- for backlink in graph.nodes[graph.homeAlias].backLinks -%}
|
||||||
{%- for backlink in backlinks -%}
|
{%- if graph.nodes[backlink].url != graph.homeAlias -%}
|
||||||
<div class="backlink-card">
|
<div class="backlink-card">
|
||||||
<i class="fa fa-link"></i> <a href="{{backlink.url}}">{{backlink.title}}</a>
|
<i class="fa fa-link"></i> <a href="{{graph.nodes[backlink].url}}">{{graph.nodes[backlink].title}}</a>
|
||||||
</div>
|
</div>
|
||||||
|
{%- endif -%}
|
||||||
{%- endfor -%}
|
{%- endfor -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- if graph.nodes[page.url].backLinks.length === 0 -%}
|
||||||
|
<div class="backlink-card">
|
||||||
|
<span class="no-backlinks-message">No other pages mentions this page</span>
|
||||||
|
</div>
|
||||||
|
{%- endif -%}
|
||||||
|
{%- for backlink in graph.nodes[page.url].backLinks -%}
|
||||||
|
{%- if graph.nodes[backlink].url != page.url -%}
|
||||||
|
<div class="backlink-card">
|
||||||
|
<i class="fa fa-link"></i> <a href="{{graph.nodes[backlink].url}}">{{graph.nodes[backlink].title}}</a>
|
||||||
|
</div>
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
{%- endif -%}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{%endif%}
|
{%endif%}
|
||||||
|
{%endif%}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,53 +0,0 @@
|
|||||||
const { extractLinks } = require("../helpers/linkUtils");
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
eleventyComputed: {
|
|
||||||
graphData: (data) => {
|
|
||||||
let nodes = {};
|
|
||||||
let links = [];
|
|
||||||
let stemURLs = {};
|
|
||||||
data.collections.note.forEach((v, idx) => {
|
|
||||||
let fpath = v.filePathStem.replace("/notes/", "");
|
|
||||||
let parts = fpath.split("/");
|
|
||||||
let group = "none";
|
|
||||||
if (parts.length >= 3) {
|
|
||||||
group = parts[parts.length - 2];
|
|
||||||
}
|
|
||||||
nodes[v.url] = {
|
|
||||||
id: idx,
|
|
||||||
title: v.data.title || v.fileSlug,
|
|
||||||
url: v.url,
|
|
||||||
group,
|
|
||||||
home: v.data["dg-home"] || false,
|
|
||||||
outBound: extractLinks(v.template.frontMatter.content),
|
|
||||||
neighbors: new Set(),
|
|
||||||
};
|
|
||||||
stemURLs[fpath] = v.url;
|
|
||||||
});
|
|
||||||
Object.values(nodes).forEach((node) => {
|
|
||||||
let outBound = new Set();
|
|
||||||
node.outBound.forEach((olink) => {
|
|
||||||
let link = (stemURLs[olink] || olink).split("#")[0];
|
|
||||||
outBound.add(link);
|
|
||||||
});
|
|
||||||
node.outBound = Array.from(outBound);
|
|
||||||
node.outBound.forEach((link) => {
|
|
||||||
let n = nodes[link];
|
|
||||||
if (n) {
|
|
||||||
n.neighbors.add(node.url);
|
|
||||||
node.neighbors.add(n.url);
|
|
||||||
links.push({ source: node.id, target: n.id });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
Object.keys(nodes).map((k) => {
|
|
||||||
nodes[k].neighbors = Array.from(nodes[k].neighbors);
|
|
||||||
nodes[k].size = nodes[k].neighbors.length;
|
|
||||||
});
|
|
||||||
return JSON.stringify({
|
|
||||||
nodes,
|
|
||||||
links,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
permalink: /graph
|
permalink: /graph.json
|
||||||
eleventyExcludeFromCollections: true
|
eleventyExcludeFromCollections: true
|
||||||
---
|
---
|
||||||
{{ graphData | safe }}
|
{{ graph | jsonify | safe }}
|
||||||
|
@ -5,12 +5,10 @@ const markdownIt = require("markdown-it");
|
|||||||
const md = markdownIt({
|
const md = markdownIt({
|
||||||
html: true,
|
html: true,
|
||||||
}).use(require("../helpers/utils").namedHeadingsFilter);
|
}).use(require("../helpers/utils").namedHeadingsFilter);
|
||||||
const { getBacklinks } = require("../helpers/linkUtils");
|
|
||||||
const allSettings = settings.ALL_NOTE_SETTINGS;
|
const allSettings = settings.ALL_NOTE_SETTINGS;
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
eleventyComputed: {
|
eleventyComputed: {
|
||||||
backlinks: (data) => getBacklinks(data),
|
|
||||||
settings: (data) => {
|
settings: (data) => {
|
||||||
const currentnote =
|
const currentnote =
|
||||||
data.collections.gardenEntry && data.collections.gardenEntry[0];
|
data.collections.gardenEntry && data.collections.gardenEntry[0];
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
require("dotenv").config();
|
require("dotenv").config();
|
||||||
const settings = require("../../helpers/constants");
|
const settings = require("../../helpers/constants");
|
||||||
const { getBacklinks } = require("../../helpers/linkUtils");
|
|
||||||
|
|
||||||
const allSettings = settings.ALL_NOTE_SETTINGS;
|
const allSettings = settings.ALL_NOTE_SETTINGS;
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
eleventyComputed: {
|
eleventyComputed: {
|
||||||
backlinks: (data) => getBacklinks(data),
|
|
||||||
settings: (data) => {
|
settings: (data) => {
|
||||||
const noteSettings = {};
|
const noteSettings = {};
|
||||||
allSettings.forEach((setting) => {
|
allSettings.forEach((setting) => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user