mirror of
https://github.com/tcsenpai/obsidiangarden_netlify.git
synced 2025-06-07 05:05:20 +00:00
Support for block ID (#29)
Transcluded block signature to id. Link in embedded section for header and block transclusion.
This commit is contained in:
parent
6c05bca5be
commit
c71685ce57
@ -14,6 +14,7 @@ module.exports = function(eleventyConfig) {
|
|||||||
html: true
|
html: true
|
||||||
})
|
})
|
||||||
.use(require("markdown-it-footnote"))
|
.use(require("markdown-it-footnote"))
|
||||||
|
.use(require("markdown-it-attrs"))
|
||||||
.use(require('markdown-it-mathjax3'), {
|
.use(require('markdown-it-mathjax3'), {
|
||||||
tex: {
|
tex: {
|
||||||
inlineMath: [
|
inlineMath: [
|
||||||
|
18
package-lock.json
generated
18
package-lock.json
generated
@ -20,6 +20,7 @@
|
|||||||
"gray-matter": "^4.0.3",
|
"gray-matter": "^4.0.3",
|
||||||
"lunr": "^2.3.9",
|
"lunr": "^2.3.9",
|
||||||
"markdown-it": "^12.3.2",
|
"markdown-it": "^12.3.2",
|
||||||
|
"markdown-it-attrs": "^4.1.6",
|
||||||
"markdown-it-footnote": "^3.0.3",
|
"markdown-it-footnote": "^3.0.3",
|
||||||
"markdown-it-mathjax3": "^4.3.1",
|
"markdown-it-mathjax3": "^4.3.1",
|
||||||
"markdown-it-plantuml": "^1.4.1",
|
"markdown-it-plantuml": "^1.4.1",
|
||||||
@ -3420,6 +3421,17 @@
|
|||||||
"markdown-it": "bin/markdown-it.js"
|
"markdown-it": "bin/markdown-it.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/markdown-it-attrs": {
|
||||||
|
"version": "4.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-4.1.6.tgz",
|
||||||
|
"integrity": "sha512-O7PDKZlN8RFMyDX13JnctQompwrrILuz2y43pW2GagcwpIIElkAdfeek+erHfxUOlXWPsjFeWmZ8ch1xtRLWpA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"markdown-it": ">= 9.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/markdown-it-footnote": {
|
"node_modules/markdown-it-footnote": {
|
||||||
"version": "3.0.3",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz",
|
||||||
@ -8957,6 +8969,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"markdown-it-attrs": {
|
||||||
|
"version": "4.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-4.1.6.tgz",
|
||||||
|
"integrity": "sha512-O7PDKZlN8RFMyDX13JnctQompwrrILuz2y43pW2GagcwpIIElkAdfeek+erHfxUOlXWPsjFeWmZ8ch1xtRLWpA==",
|
||||||
|
"requires": {}
|
||||||
|
},
|
||||||
"markdown-it-footnote": {
|
"markdown-it-footnote": {
|
||||||
"version": "3.0.3",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz",
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
"gray-matter": "^4.0.3",
|
"gray-matter": "^4.0.3",
|
||||||
"lunr": "^2.3.9",
|
"lunr": "^2.3.9",
|
||||||
"markdown-it": "^12.3.2",
|
"markdown-it": "^12.3.2",
|
||||||
|
"markdown-it-attrs": "^4.1.6",
|
||||||
"markdown-it-footnote": "^3.0.3",
|
"markdown-it-footnote": "^3.0.3",
|
||||||
"markdown-it-mathjax3": "^4.3.1",
|
"markdown-it-mathjax3": "^4.3.1",
|
||||||
"markdown-it-plantuml": "^1.4.1",
|
"markdown-it-plantuml": "^1.4.1",
|
||||||
|
108
src/helpers/linkUtils.js
Normal file
108
src/helpers/linkUtils.js
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
const wikilink = /\[\[(.*?\|.*?)\]\]/g
|
||||||
|
const internalLinkRegex = /href="\/(.*?)"/g;
|
||||||
|
|
||||||
|
|
||||||
|
function caselessCompare(a, b) {
|
||||||
|
return a.toLowerCase() === b.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractLinks(content) {
|
||||||
|
return[...(content.match(wikilink) || []).map(link => (
|
||||||
|
link.slice(2, -2)
|
||||||
|
.split("|")[0]
|
||||||
|
.replace(/.(md|markdown)\s?$/i, "")
|
||||||
|
.replace("\\", "")
|
||||||
|
.trim()
|
||||||
|
)), ...(content.match(internalLinkRegex) || []).map(
|
||||||
|
(link) =>
|
||||||
|
link
|
||||||
|
.slice(6, -1)
|
||||||
|
.split("|")[0]
|
||||||
|
.replace(/.(md|markdown)\s?$/i, "")
|
||||||
|
.replace("\\", "")
|
||||||
|
.trim()
|
||||||
|
)];
|
||||||
|
}
|
||||||
|
|
||||||
|
function getBacklinks(data) {
|
||||||
|
const notes = data.collections.note;
|
||||||
|
if (!notes) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
const currentFileSlug = data.page.filePathStem.replace('/notes/', '');
|
||||||
|
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.page.fileSlug,
|
||||||
|
preview,
|
||||||
|
id: counter++
|
||||||
|
})
|
||||||
|
uniqueLinks.add(otherNote.url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return backlinks;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getOutboundLinks(data, isHome=false){
|
||||||
|
const notes = data.collections.note;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (!notes || notes.length == 0) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
let currentNote;
|
||||||
|
if (isHome) {
|
||||||
|
currentNote = data.collections.gardenEntry && data.collections.gardenEntry[0];
|
||||||
|
} else {
|
||||||
|
const currentFileSlug = data.page.filePathStem.replace('/notes/', '');
|
||||||
|
currentNote = notes.find(x => x.data.page.filePathStem && caselessCompare(x.data.page.filePathStem.replace('/notes/', ''), currentFileSlug));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!currentNote) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
let counter = 1;
|
||||||
|
let uniqueLinks = new Set();
|
||||||
|
|
||||||
|
const outboundLinks = extractLinks(currentNote.template.frontMatter.content);
|
||||||
|
let outbound = outboundLinks.map(fileslug => {
|
||||||
|
var outboundNote = notes.find(x => caselessCompare(x.data.page.filePathStem.replace("/notes/", ""), fileslug) || x.data.page.url == fileslug.split("#")[0]);
|
||||||
|
if (!outboundNote) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (!uniqueLinks.has(outboundNote.url)) {
|
||||||
|
|
||||||
|
uniqueLinks.add(outboundNote.url);
|
||||||
|
return {
|
||||||
|
url: outboundNote.url,
|
||||||
|
title: outboundNote.data.page.fileSlug,
|
||||||
|
id: counter++,
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}).filter(x => x);
|
||||||
|
return outbound;
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.wikilink = wikilink;
|
||||||
|
exports.internalLinkRegex = internalLinkRegex;
|
||||||
|
exports.getBacklinks = getBacklinks;
|
||||||
|
exports.getOutboundLinks = getOutboundLinks;
|
||||||
|
exports.caselessCompare = caselessCompare;
|
||||||
|
exports.extractLinks = extractLinks;
|
@ -2,98 +2,18 @@
|
|||||||
require("dotenv").config();
|
require("dotenv").config();
|
||||||
const settings = require("../helpers/constants");
|
const settings = require("../helpers/constants");
|
||||||
|
|
||||||
const wikilink = /\[\[(.*?\|.*?)\]\]/g
|
|
||||||
|
|
||||||
const markdownIt = require("markdown-it");
|
const markdownIt = require("markdown-it");
|
||||||
|
const { getBacklinks, getOutboundLinks } = require("../helpers/linkUtils");
|
||||||
const md = markdownIt({
|
const md = markdownIt({
|
||||||
html: true,
|
html: true,
|
||||||
}).use(require("../helpers/utils").namedHeadingsFilter);
|
}).use(require("../helpers/utils").namedHeadingsFilter);
|
||||||
|
|
||||||
function caselessCompare(a, b) {
|
|
||||||
return a.toLowerCase() === b.toLowerCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
const allSettings = settings.ALL_NOTE_SETTINGS;
|
const allSettings = settings.ALL_NOTE_SETTINGS;
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
eleventyComputed: {
|
eleventyComputed: {
|
||||||
backlinks: (data) => {
|
backlinks: (data) => getBacklinks(data),
|
||||||
const notes = data.collections.note;
|
outbound: (data) => getOutboundLinks(data, true),
|
||||||
if (!notes) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
const currentFileSlug = data.page.filePathStem.replace('/notes/', '');
|
|
||||||
|
|
||||||
let backlinks = [];
|
|
||||||
let counter = 1;
|
|
||||||
|
|
||||||
for (const otherNote of notes) {
|
|
||||||
const noteContent = otherNote.template.frontMatter.content;
|
|
||||||
|
|
||||||
const outboundLinks = (noteContent.match(wikilink) || []).map(link => (
|
|
||||||
link.slice(2, -2)
|
|
||||||
.split("|")[0]
|
|
||||||
.replace(/.(md|markdown)\s?$/i, "")
|
|
||||||
.replace("\\", "")
|
|
||||||
.trim()
|
|
||||||
));
|
|
||||||
|
|
||||||
if (outboundLinks.some(link => caselessCompare(link, currentFileSlug))) {
|
|
||||||
|
|
||||||
let preview = noteContent.slice(0, 240);
|
|
||||||
backlinks.push({
|
|
||||||
url: otherNote.url,
|
|
||||||
title: otherNote.data.page.fileSlug,
|
|
||||||
preview,
|
|
||||||
id: counter++
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return backlinks;
|
|
||||||
|
|
||||||
},
|
|
||||||
outbound: (data) => {
|
|
||||||
const notes = data.collections.note;
|
|
||||||
|
|
||||||
if (!notes || notes.length == 0) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
const currentNote = data.collections.gardenEntry && data.collections.gardenEntry[0];
|
|
||||||
if (!currentNote) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
let counter = 1;
|
|
||||||
|
|
||||||
const noteContent = currentNote.template.frontMatter.content;
|
|
||||||
|
|
||||||
const outboundLinks = (noteContent.match(wikilink) || []).map(link => (
|
|
||||||
link.slice(2, -2)
|
|
||||||
.split("|")[0]
|
|
||||||
.replace(/.(md|markdown)\s?$/i, "")
|
|
||||||
.replace("\\", "")
|
|
||||||
.trim()
|
|
||||||
));
|
|
||||||
|
|
||||||
let outbound = outboundLinks.map(fileslug => {
|
|
||||||
var outboundNote = notes.find(x => caselessCompare(x.data.page.filePathStem.replace("/notes/", ""), fileslug));
|
|
||||||
if (!outboundNote) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
url: outboundNote.url,
|
|
||||||
title: outboundNote.data.page.fileSlug,
|
|
||||||
id: counter++
|
|
||||||
}
|
|
||||||
}).filter(x => x);
|
|
||||||
|
|
||||||
return outbound;
|
|
||||||
|
|
||||||
},
|
|
||||||
settings: (data) => {
|
settings: (data) => {
|
||||||
const currentnote = data.collections.gardenEntry && data.collections.gardenEntry[0];
|
const currentnote = data.collections.gardenEntry && data.collections.gardenEntry[0];
|
||||||
if (currentnote && currentnote.data) {
|
if (currentnote && currentnote.data) {
|
||||||
|
@ -1,94 +1,14 @@
|
|||||||
|
|
||||||
require("dotenv").config();
|
require("dotenv").config();
|
||||||
const settings = require("../../helpers/constants");
|
const settings = require("../../helpers/constants");
|
||||||
|
const { getBacklinks, getOutboundLinks } = require("../../helpers/linkUtils");
|
||||||
const wikilink = /\[\[(.*?\|.*?)\]\]/g
|
|
||||||
|
|
||||||
function caselessCompare(a, b) {
|
|
||||||
return a.toLowerCase() === b.toLowerCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
const allSettings = settings.ALL_NOTE_SETTINGS;
|
const allSettings = settings.ALL_NOTE_SETTINGS;
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
eleventyComputed: {
|
eleventyComputed: {
|
||||||
backlinks: (data) => {
|
backlinks: (data) => getBacklinks(data),
|
||||||
const notes = data.collections.note;
|
outbound: (data) => getOutboundLinks(data),
|
||||||
if (!notes) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
const currentFileSlug = data.page.filePathStem.replace('/notes/', '');
|
|
||||||
|
|
||||||
let backlinks = [];
|
|
||||||
let counter = 1;
|
|
||||||
|
|
||||||
for (const otherNote of notes) {
|
|
||||||
const noteContent = otherNote.template.frontMatter.content;
|
|
||||||
|
|
||||||
const outboundLinks = (noteContent.match(wikilink) || []).map(link => (
|
|
||||||
link.slice(2, -2)
|
|
||||||
.split("|")[0]
|
|
||||||
.replace(/.(md|markdown)\s?$/i, "")
|
|
||||||
.replace("\\", "")
|
|
||||||
.trim()
|
|
||||||
));
|
|
||||||
|
|
||||||
if (outboundLinks.some(link => caselessCompare(link, currentFileSlug))) {
|
|
||||||
|
|
||||||
let preview = noteContent.slice(0, 240);
|
|
||||||
backlinks.push({
|
|
||||||
url: otherNote.url,
|
|
||||||
title: otherNote.data.page.fileSlug,
|
|
||||||
preview,
|
|
||||||
id: counter++
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return backlinks;
|
|
||||||
|
|
||||||
},
|
|
||||||
outbound: (data) => {
|
|
||||||
const notes = data.collections.note;
|
|
||||||
const currentFileSlug = data.page.filePathStem.replace('/notes/', '');
|
|
||||||
|
|
||||||
if (!notes || notes.length == 0) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
const currentNote = notes.find(x => x.data.page.filePathStem && caselessCompare(x.data.page.filePathStem.replace('/notes/', ''), currentFileSlug));
|
|
||||||
if (!currentNote) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
let counter = 1;
|
|
||||||
|
|
||||||
const noteContent = currentNote.template.frontMatter.content;
|
|
||||||
|
|
||||||
const outboundLinks = (noteContent.match(wikilink) || []).map(link => (
|
|
||||||
link.slice(2, -2)
|
|
||||||
.split("|")[0]
|
|
||||||
.replace(/.(md|markdown)\s?$/i, "")
|
|
||||||
.replace("\\", "")
|
|
||||||
.trim()
|
|
||||||
));
|
|
||||||
|
|
||||||
let outbound = outboundLinks.map(fileslug => {
|
|
||||||
var outboundNote = notes.find(x => caselessCompare(x.data.page.filePathStem.replace("/notes/", ""), fileslug));
|
|
||||||
if (!outboundNote) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
url: outboundNote.url,
|
|
||||||
title: outboundNote.data.page.fileSlug,
|
|
||||||
id: counter++
|
|
||||||
}
|
|
||||||
}).filter(x => x);
|
|
||||||
|
|
||||||
return outbound;
|
|
||||||
|
|
||||||
},
|
|
||||||
settings: (data) => {
|
settings: (data) => {
|
||||||
const noteSettings = {};
|
const noteSettings = {};
|
||||||
allSettings.forEach(setting => {
|
allSettings.forEach(setting => {
|
||||||
|
@ -40,6 +40,12 @@ body {
|
|||||||
div.translusion {
|
div.translusion {
|
||||||
border-left: 4px solid gray;
|
border-left: 4px solid gray;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
|
position: relative;
|
||||||
|
.markdown-embed-link {
|
||||||
|
z-index: 99;
|
||||||
|
display: block;
|
||||||
|
width: auto !important;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.admonition-title {
|
.admonition-title {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user