XeNote/lib/transformer.js

193 lines
7.4 KiB
JavaScript
Raw Normal View History

2020-11-30 11:29:34 +00:00
import matter from 'gray-matter'
2022-04-05 03:45:30 +00:00
import unified from "unified";
import markdown from "remark-parse";
import {wikiLinkPlugin} from "remark-wiki-link";
import html from "remark-html";
import frontmatter from "remark-frontmatter";
import externalLinks from "remark-external-links";
import highlight from "remark-highlight.js";
import {Node} from "./node";
import rehypePrism from 'rehype-prism-plus'
import remarkRehype from 'remark-rehype'
import rehypeStringify from 'rehype-stringify'
import {getAllMarkdownFiles, toFilePath, toSlug} from "./utils";
2020-11-30 11:29:34 +00:00
export const Transformer = {
haveFrontMatter: function (content) {
2020-11-30 11:29:34 +00:00
//console.log("\t Front matter data content", content)
if (!content) return false
const indexOfFirst = content.indexOf("---");
2020-11-30 11:29:34 +00:00
//console.log("\t Front matter data firstIndex ", indexOfFirst)
//console.log("index first", indexOfFirst)
if (indexOfFirst === -1) {
2020-11-30 11:29:34 +00:00
return false
}
let indexOfSecond = content.indexOf("---", (indexOfFirst + 1));
return indexOfSecond !== -1;
2020-11-30 11:29:34 +00:00
},
getFrontMatterData: function (filecontent) {
if (Transformer.haveFrontMatter(filecontent)) {
2020-11-30 11:29:34 +00:00
return matter(filecontent).data
}
return {}
},
pageResolver: function (pageName) {
const allFileNames = getAllMarkdownFiles()
const result = allFileNames.find(aFile => {
let parseFileNameFromPath = Transformer.parseFileNameFromPath(aFile);
return Transformer.normalizeFileName(parseFileNameFromPath) === Transformer.normalizeFileName(pageName)
}
)
// permalink = permalink.replace("ç", "c").replace("ı", "i").replace("ş", "s")
// console.log(`/note/${toSlug(result)}`)
if (result === undefined || result.length === 0) {
2022-04-18 09:37:59 +00:00
// console.log("Cannot resolve file path " + pageName)
}
// console.log("Internal Link resolved: [" + pageName + "] ==> [" + temp[0] +"]")
return (result !== undefined && result.length > 0) ? [toSlug(result)] : ["/"]
},
hrefTemplate: function (permalink) {
// permalink = Transformer.normalizeFileName(permalink)
permalink = permalink.replace("ç", "c").replace("ı", "i").replace("ş", "s")
return `/note/${permalink}`;
}, getHtmlContent: function (content) {
2020-11-30 11:29:34 +00:00
let htmlContent = []
const sanitizedContent = Transformer.preprocessThreeDashes(content)
unified()
.use(markdown, {gfm: true})
2020-11-30 11:29:34 +00:00
.use(highlight)
2021-03-03 21:33:38 +00:00
.use(externalLinks, {target: "_blank", rel: ['noopener']})
2020-11-30 11:29:34 +00:00
.use(frontmatter, ['yaml', 'toml'])
.use(wikiLinkPlugin, {
permalinks: null,
pageResolver: function (pageName) {
return Transformer.pageResolver(pageName)
},
hrefTemplate: function (permalink) {
return Transformer.hrefTemplate(permalink);
},
aliasDivider: "|"
})
.use(remarkRehype)
.use(rehypePrism)
.use(rehypeStringify)
2020-11-30 11:29:34 +00:00
.process(sanitizedContent,
function (err, file) {
htmlContent.push(String(file).replace("\n", ""))
if (err) {
console.log("ERRROR:" + err)
}
}
2020-11-30 11:29:34 +00:00
)
htmlContent = htmlContent.join("")
2020-11-30 11:29:34 +00:00
htmlContent = htmlContent.split("---")
return [htmlContent]
2020-11-30 11:29:34 +00:00
},
/* SANITIZE MARKDOWN FOR --- */
preprocessThreeDashes: function (content) {
const indexOfFirst = content.indexOf("---");
if (indexOfFirst === -1) {
2020-11-30 11:29:34 +00:00
return content
}
const indexOfSecond = content.indexOf("---", (indexOfFirst + 1));
content.slice(0, indexOfSecond);
2020-11-30 11:29:34 +00:00
const contentPart = content.slice(indexOfSecond);
return contentPart.split("---").join("")
2020-11-30 11:29:34 +00:00
},
/* Normalize File Names */
normalizeFileName: function (filename) {
let processedFileName = filename.replace(".md", "");
2020-12-01 03:28:42 +00:00
processedFileName = processedFileName.replace('(', '').replace(')', '')
2020-11-30 11:29:34 +00:00
processedFileName = processedFileName.split(" ").join("-")
processedFileName = processedFileName.toLowerCase()
2020-12-01 03:28:42 +00:00
const conversionLetters = [
["ç", "c"], ["ş", "s"], ["ı", "i"], ["ü", "u"], ["ö", "o"], ["ğ", "g"],
["Ç", "C"], ["Ş", "S"], ["İ", "I"], ["Ü", "U"], ["Ö", "O"], ["Ğ", "G"]
2020-12-01 03:28:42 +00:00
];
2020-11-30 11:29:34 +00:00
conversionLetters.forEach(letterPair => {
processedFileName = processedFileName.split(letterPair[0]).join(letterPair[1])
//processedFileName = processedFileName.replace(letterPair[0], letterPair[1])
2020-11-30 11:29:34 +00:00
}
)
//console.log("filename", processedFileName)
return processedFileName
},
/* Parse file name from path then sanitize it */
parseFileNameFromPath: function (filepath) {
if (typeof filepath ==='string' && filepath.includes("/")) {
const parsedFileFromPath = filepath.split("/")[filepath.split("/").length - 1]
return parsedFileFromPath.replace(".md", "")
} else {
console.log("Failed: CANNOT Parse" + filepath)
return null
}
2020-11-30 11:29:34 +00:00
},
/* Pair provided and existing Filenames*/
getInternalLinks: function (aFilePath) {
const fileContent = Node.readFileSync(aFilePath);
const internalLinks = []
const sanitizedContent = Transformer.preprocessThreeDashes(fileContent)
unified()
.use(markdown, {gfm: true})
.use(wikiLinkPlugin, {
pageResolver: function (pageName) {
// let name = [Transformer.parseFileNameFromPath(pageName)];
2022-04-17 13:22:50 +00:00
let canonicalSlug;
if (pageName.includes('#')) {
2022-04-18 00:58:20 +00:00
// console.log(pageName)
2022-04-17 13:22:50 +00:00
const tempSlug = pageName.split('#')[0]
if (tempSlug.length === 0) {
// Meaning it in form of #Heading1 --> slug will be this file slug
canonicalSlug = toSlug(aFilePath)
} else {
canonicalSlug =Transformer.pageResolver(tempSlug)[0].split('#')[0]
}
} else {
canonicalSlug = Transformer.pageResolver(pageName)[0].split('#')[0]
}
2022-04-17 13:22:50 +00:00
const backLink = {
title: Transformer.parseFileNameFromPath(toFilePath(canonicalSlug)),
slug: canonicalSlug,
shortSummary: canonicalSlug
}
if (canonicalSlug != null && internalLinks.indexOf(canonicalSlug) < 0) {
internalLinks.push(backLink);
}
return [canonicalSlug]
}
,
hrefTemplate: function (permalink) {
return Transformer.hrefTemplate(permalink)
},
aliasDivider: "|"
})
.use(html)
.processSync(sanitizedContent)
// console.log("Internal Links of: " + aFilePath)
// internalLinks.forEach(aLink => {
// console.log(aLink.title + " --> " + aLink.slug)
// })
// console.log("===============Internal Links")
return internalLinks;
2020-11-30 11:29:34 +00:00
}
}