179 lines
6.0 KiB
JavaScript
179 lines
6.0 KiB
JavaScript
import path from 'path'
|
|
import matter, { test } from 'gray-matter'
|
|
import fs from "fs"
|
|
import { Node } from "./node"
|
|
import { Transformer } from "./transformer";
|
|
import BiMap from "bimap";
|
|
|
|
|
|
|
|
|
|
const postsDirectory = path.join(process.cwd(), 'posts')
|
|
|
|
export function getSinglePost(filename) {
|
|
console.log("\n\nFile is scanning: ", filename)
|
|
// Check if sidebar or not
|
|
var filePaths = Node.getFiles(postsDirectory).filter(fn => fn.endsWith(".md"))
|
|
|
|
// IF filename is not sidebar.md THEN Exclude sidebar.md from file list
|
|
filePaths = filename === "sidebar.md" ? filePaths : filePaths.filter(f => !f.endsWith("sidebar.md"))
|
|
|
|
// List of filenames that will provide existing links to wikilink
|
|
const fileNames = filePaths.map(f => Transformer.parseFileNameFromPath(f))
|
|
|
|
//console.log("\tDirectory is scanning to find corresponding filename")
|
|
const currentFilePath = Transformer.pairCurrentFile(filename, filePaths)
|
|
//console.log("\tScan is finished. Founded filepath", currentFilePath, "\n")
|
|
|
|
|
|
var fileContent = Node.readFileSync(currentFilePath)
|
|
|
|
//console.log("\tSearching any front matter data")
|
|
const currentFileFrontMatter = Transformer.getFrontMatterData(fileContent)
|
|
//console.log("\tFounded front matter data: ", currentFileFrontMatter, "\n")
|
|
|
|
//fileContent = fileContent.split("---").join("")
|
|
//console.log("filecontent end")
|
|
|
|
const [htmlContent, backlinks] = Transformer.getHtmlContent(fileContent, {
|
|
fileNames:fileNames,
|
|
})
|
|
//console.log("hrmlcontents and backlinks")
|
|
return {
|
|
id:filename,
|
|
...currentFileFrontMatter,
|
|
data:htmlContent
|
|
}
|
|
|
|
}
|
|
|
|
export function getAllBacklinks(){
|
|
//console.log("\n\nBacklinks are scanning")
|
|
//var bimap = new BiMap
|
|
var internalLinks = []
|
|
|
|
// Get file names under /posts
|
|
const filePaths = Node.getFiles(postsDirectory).filter(fn => fn.endsWith(".md")).filter(f => !f.endsWith("sidebar.md"))
|
|
const fileNames = filePaths.map(f => Transformer.parseFileNameFromPath(f))
|
|
//console.log("\tFounded filePaths: ", fileNames)
|
|
|
|
var allBacklinkData = filePaths.map(fileName => {
|
|
// Remove ".md" from file name to get id
|
|
const slug = Transformer.parseFileNameFromPath(fileName)
|
|
|
|
//console.log("filename", fileNames)
|
|
const fileData = {
|
|
id:slug
|
|
}
|
|
|
|
//console.log("AllBacklinks slug", slug)
|
|
|
|
// Read markdown file as string
|
|
var fileContent = Node.readFileSync(fileName, 'utf8')
|
|
|
|
const frontmatterData = Transformer.getFrontMatterData(fileContent)
|
|
const requiredParameters = ["title", "description"]
|
|
requiredParameters.forEach(param => {
|
|
if (frontmatterData[param])
|
|
fileData[param] = frontmatterData[param]
|
|
})
|
|
|
|
//fileContent = fileContent.split("---").join("")
|
|
const [htmlContent, backlinks] = Transformer.getHtmlContent(fileContent, {
|
|
fileNames:fileNames,
|
|
})
|
|
// Check if scanned slug post has any internal links
|
|
const existingInternalLink = backlinks.filter(bl => fileNames.includes(bl))
|
|
fileData.to = existingInternalLink
|
|
fileData.href = slug === "index" ? "/" : `/note/${slug}`
|
|
//console.log("\n\nbacklinks",[ slug, [backlinks]] )
|
|
//bimap.push(slug, backlinks)
|
|
|
|
// Check if internal link exists
|
|
//const internalLinks = backlinks.filter(bl => fileNames.includes(bl))
|
|
internalLinks.push(fileData)
|
|
//console.log("bimap: ", bimap.key(slug))
|
|
|
|
// Combine the data with the slug
|
|
//return backlinkList.length > 0 ? JSON.stringify(backlinkList) : null
|
|
})
|
|
|
|
//console.log("founded internal links for ", internalLinks)
|
|
//console.log("\n\ninternal list: ", internalLinks)
|
|
return internalLinks
|
|
//return [allBacklinkData.filter(bl => bl !== null), JSON.stringify(fileNames)]
|
|
}
|
|
|
|
export function getGraphData(){
|
|
const backlinkData = getAllBacklinks()
|
|
|
|
const elements = []
|
|
|
|
// First create Nodes
|
|
backlinkData.forEach(el => {
|
|
const node = {data: {id: el.id}};
|
|
|
|
if(el.title){
|
|
node.data.title = el.title
|
|
}
|
|
if (el.description){
|
|
node.data.description = el.description
|
|
}
|
|
elements.push(node)
|
|
}
|
|
)
|
|
|
|
|
|
// Second create Edges
|
|
backlinkData.forEach(el => {
|
|
// check if has any internal link
|
|
if (el.to.length > 0){
|
|
// create edge from element to its links
|
|
el.to.forEach(linkElement => {
|
|
const edge = {
|
|
data: {
|
|
id: `${el.id}-${linkElement}`,
|
|
source: el.id,
|
|
target: linkElement
|
|
}
|
|
}
|
|
elements.push(edge)
|
|
})
|
|
}
|
|
})
|
|
|
|
return elements
|
|
}
|
|
|
|
export function getPostListData() {
|
|
//console.log("\n\nAll Posts are scanning")
|
|
// Get file names under /posts
|
|
const filePaths = Node.getFiles(postsDirectory).filter(fn => fn.endsWith(".md"))
|
|
const fileNames = filePaths.map(f => Transformer.parseFileNameFromPath(f))
|
|
//console.log("filePaths", filePaths)
|
|
|
|
var allPostsData = filePaths.map(filePath => {
|
|
//console.log("filePath", filePaths)
|
|
// Remove ".md" from file name to get id
|
|
const slug = Transformer.parseFileNameFromPath(filePath)
|
|
//console.log("slug", slug)
|
|
|
|
// Read markdown file as string
|
|
var fileContent = Transformer.preprocessThreeDashes(Node.readFileSync(filePath))
|
|
//console.log("all backlinks fn")
|
|
// Use gray-matter to parse the post metadata section
|
|
const matterResult = Transformer.getFrontMatterData(fileContent) || [] // matter(fileContent).data
|
|
//console.log("all post fn....")
|
|
|
|
//const permalink = matterResult.permalink
|
|
//const content = fileContent.split("---\n")[fileContent.split("---").length -1 ]
|
|
|
|
// Combine the data with the slug
|
|
return {
|
|
id:slug.toLowerCase().split(" ").join("-"),
|
|
...matterResult,
|
|
}
|
|
})
|
|
|
|
return allPostsData
|
|
} |