From e71bbc741e9857d65f1658fa791c0815beaa6cc9 Mon Sep 17 00:00:00 2001
From: Can <>
Date: Mon, 30 Nov 2020 14:29:34 +0300
Subject: [PATCH] ...
---
components/graph.js | 172 +++++++++
components/layout.js | 2 +-
lib/node.js | 3 +-
lib/post.js | 198 +++++++----
lib/remark.js | 58 ---
lib/transformer.js | 143 ++++++++
package.json | 10 +-
pages/_app.js | 3 +-
pages/_document.js | 55 +--
pages/index.js | 37 +-
pages/note/[id].js | 65 +++-
posts/.obsidian/workspace | 8 +-
posts/Code/CSS/Frost-Effect.md | 2 +
posts/Code/Codesheet.md | 5 +-
posts/Code/HTML/https-force-meta-tag.md | 1 +
posts/Code/Svelte/External Script Loader.md | 2 +-
posts/articles-eng/Collaborative Filtering.md | 1 -
posts/articles-eng/Confluence Installation.md | 2 +
posts/articles-tr/En İyi Blog Siteleri.md | 16 +-
posts/articles-tr/Zettelkasten Metodu.md | 6 +-
posts/sidebar.md | 6 +-
settings.json | 3 +
styles/webflow-layout.css | 79 ++++-
yarn.lock | 329 +++++++++++++++++-
24 files changed, 1000 insertions(+), 206 deletions(-)
create mode 100644 components/graph.js
delete mode 100644 lib/remark.js
create mode 100644 lib/transformer.js
create mode 100644 posts/Code/HTML/https-force-meta-tag.md
create mode 100644 settings.json
diff --git a/components/graph.js b/components/graph.js
new file mode 100644
index 0000000..249ec00
--- /dev/null
+++ b/components/graph.js
@@ -0,0 +1,172 @@
+import Cytoscape from "cytoscape";
+var nodeHtmlLabel = require('cytoscape-node-html-label');
+
+
+const Graph = ({ el, graphdata, current }) => {
+ nodeHtmlLabel( Cytoscape );
+
+ var cy = Cytoscape({
+ container:el,
+ elements:graphdata,
+ style:[{
+ selector: "node",
+ style:{
+ "background-color" : el => el.data("id") === current ? '#5221c4' : "#666",
+ "font-size": "10px",
+ "width": "20px",
+ "height": "20px"
+ //"label": el => el.data("id") === current ? "" : el.data('title') ? el.data("title").slice(0,16) : el.data("id")
+ }
+ },{
+ selector: "label",
+ style: {"font-size": "12px"},
+ },
+ {
+ selector: 'edge',
+ style: {
+ 'width': 2,
+ "height":200,
+ 'line-color': '#5221c4',
+ 'target-arrow-color': '#ccc',
+ 'target-arrow-shape': 'triangle',
+ 'curve-style': 'bezier'
+ }
+ }],
+ layout: {
+ name: 'circle',
+
+ fit: true, // whether to fit the viewport to the graph
+ padding: 32, // the padding on fit
+ boundingBox: undefined, // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }
+ avoidOverlap: true, // prevents node overlap, may overflow boundingBox and radius if not enough space
+ nodeDimensionsIncludeLabels: false, // Excludes the label when calculating node bounding boxes for the layout algorithm
+ spacingFactor: 0.9, // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up
+ radius: 180, // the radius of the circle
+ startAngle: -2 / 4 * Math.PI, // where nodes start in radians
+ //sweep: undefined, // how many radians should be between the first and last node (defaults to full circle)
+ clockwise: true, // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)
+ sort: undefined, // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') }
+ animate: false, // whether to transition the node positions
+ animationDuration: 500, // duration of animation in ms if enabled
+ animationEasing: undefined, // easing of animation if enabled
+ //animateFilter: function ( node, i ){ return true; }, // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts
+ ready: undefined, // callback on layoutready
+ stop: undefined, // callback on layoutstop
+ transform: function (node, position ){ return position; } // transform a given node position. Useful for changing flow direction in discrete layouts
+
+
+
+ },
+ zoom: 10,
+ hideEdgesOnViewport:false,
+ wheelSensitivity:0.2,
+ })
+
+ cy.nodeHtmlLabel( [{
+ query: "node",
+ halign:"top",
+ valign:"center",
+ cssClass: 'label',
+ tpl: el => {
+ //el.data("id") === current ? "" : el.data('title') ? el.data("title").slice(0,16) : el.data("id")
+ const label = el.id === current ? "" : el.title ? el.title : el.id
+ return `
${label}
`
+ }}],
+ {
+ enablePointerEvents: true
+ }
+ )
+ return cy
+}
+
+
+export const Network = ({ el, graphdata, current, router, allNodes }) => {
+ var jsnx = require('jsnetworkx');
+
+
+
+ var currentnode = graphdata.filter(g => g.data.id === current)[0]
+ currentnode = [currentnode.data.id, { href:current==="index" ? "/" : `/note/${currentnode.data.id}` }];
+
+ var othernodes, edges;
+ if (allNodes){
+ othernodes = graphdata.filter(g => g.data.id !== current)
+ othernodes = othernodes.map(on => [on.data.id ,{
+ title:on.data.title ? on.data.title : on.data.id,
+ href: current === "index" ? "/" : `/note/${on.data.id}`
+ }
+ ])
+ edges = graphdata.filter(g => g.data.source)
+ edges = edges.map(e => [e.data.source, e.data.target])
+ }
+ else {
+ var indexnode = graphdata.filter(g => g.data.id === "index")[0]
+ indexnode = ["Home", {
+ width:30,
+ height:30,
+ weight:10,
+ href:`/`,
+ title: "Home",
+ fill:"blueviolet",
+
+ }]
+
+ var currentRawEdges = graphdata.filter(g => g.data.source === current)
+ edges = currentRawEdges.map(ce => [ce.data.source, ce.data.target, {weight:5 } ])
+
+ var currentTargetNames = currentRawEdges.map(ie => ie.data.target)
+ var currentTargets = graphdata.filter(g => currentTargetNames.includes(g.data.id))
+ othernodes = currentTargets.map(ct => [ct.data.id, {size:6, href:`/note/${ct.data.id}`}])
+ othernodes = [indexnode, ...othernodes]
+ }
+
+
+
+ var G = new jsnx.completeGraph();
+ G.addNodesFrom(
+ [
+ currentnode,
+ ...othernodes,
+ ],
+ {color: 'black', width:60, height:60}
+ );
+ G.addEdgesFrom(edges);
+
+ jsnx.draw(G, {
+ element: el,
+ withLabels: true,
+ labelStyle:{
+ color:"#ffffff"
+ },
+ labelAttr:{
+ class: "node-label",
+ y:16,
+ click:function(l){
+ this.addEventListener("click", function(){
+ router.push(l.data.href)
+ })
+ }
+ },
+ layoutAttr:{
+ linkDistance:260,
+ },
+ nodeStyle: {
+ fill:"black"
+ },
+ nodeAttr:{
+
+ click:function(l){
+ //console.log("lll",this, "\n", l);
+ this.addEventListener("click", function(){
+ router.push(l.data.href)
+ })
+ }
+ },
+ edgeStyle:{
+ height:120
+ }
+ }, true);
+ return G
+}
+
+export default Graph;
\ No newline at end of file
diff --git a/components/layout.js b/components/layout.js
index 1adf12f..400f1db 100644
--- a/components/layout.js
+++ b/components/layout.js
@@ -9,7 +9,7 @@ export default function Layout({ children, home }) {
const [isOpen, setIsOpen] = useState(null)
const toggle = () => setIsOpen(!isOpen)
- const sidebarposition = isOpen ? "0px" : "-250px"
+ const sidebarposition = isOpen ? "0px" : "-350px"
//console.log("effect: ", isOpen, sidebarposition)
useEffect(()=>{
diff --git a/lib/node.js b/lib/node.js
index dcf6b28..d951cdb 100644
--- a/lib/node.js
+++ b/lib/node.js
@@ -27,5 +27,6 @@ export const Node = {
},
readFileSync:function(fullPath){
return fs.readFileSync(fullPath, "utf8")
- }
+ },
+
}
\ No newline at end of file
diff --git a/lib/post.js b/lib/post.js
index d9cc200..c523a51 100644
--- a/lib/post.js
+++ b/lib/post.js
@@ -2,7 +2,7 @@ import path from 'path'
import matter, { test } from 'gray-matter'
import fs from "fs"
import { Node } from "./node"
-import { Remark } from "./remark";
+import { Transformer } from "./transformer";
import BiMap from "bimap";
@@ -10,110 +10,170 @@ import BiMap from "bimap";
const postsDirectory = path.join(process.cwd(), 'posts')
-export function getSinglePost(filename, permalink) {
+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"))
- console.log("permalink", filename, filePaths)
+
+ // 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"))
- const fileNames = filePaths.map(f => f.split("/")[f.split("/").length - 1].replace(".md", ""))
- const filesFrontMatterData = filePaths.map(fp => Remark.getFrontMatterData(fp))
+ // 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")
+
- const currentFile = filePaths.filter(f => {
- var testFileName = f.split("/")[f.split("/").length - 1].replace(".md", "")
- //testFileName = testFileName.replace("Ç","c").replace("ç","c").replace("ı","i").replace("ş","s")
- const testFileNameAlternative = testFileName.toLowerCase().split(" ").join("-")
- return (filename.replace(".md", "") === testFileName || filename.replace(".md", "") === testFileNameAlternative)
- })[0]
- console.log("currenFile: ", currentFile)
- //const currentFileFrontMatter = filesFrontMatterData.filter(f => f.permalink === permalink)[0]
- //console.log("Current File By Name: ", currentFile)
- //const currentFileFrontMatter = Remark.getFrontMatterData(currentFile)
- //console.log("Current File By FrontMatter: ", currentFileFrontMatter)
+ var fileContent = Node.readFileSync(currentFilePath)
- const fileContent = fs.readFileSync(currentFile, 'utf8')
+ //console.log("\tSearching any front matter data")
+ const currentFileFrontMatter = Transformer.getFrontMatterData(fileContent)
+ //console.log("\tFounded front matter data: ", currentFileFrontMatter, "\n")
- const [htmlContent, backlinks] = Remark.getHtmlContent(fileContent, {
+ //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,
+ ...currentFileFrontMatter,
data:htmlContent
}
}
export function getAllBacklinks(){
+ //console.log("\n\nBacklinks are scanning")
//var bimap = new BiMap
- var backlinkList = []
- //bimap.push("key", "value");
- //bimap.key("key"); // => "value"
- //bimap.val("value"); // => "key"
- //bimap.push("France", ["Paris", "Lyon", "Marseille"]);
+ 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 => f.split("/")[f.split("/").length - 1].replace(".md", ""))
- //console.log("filePaths", fileNames)
+ const fileNames = filePaths.map(f => Transformer.parseFileNameFromPath(f))
+ //console.log("\tFounded filePaths: ", fileNames)
var allBacklinkData = filePaths.map(fileName => {
- //console.log("filename", fileNames)
// Remove ".md" from file name to get id
- const slug = fileName.replace(/\.md$/, '').split("/")[fileName.split("/").length - 1]
+ const slug = Transformer.parseFileNameFromPath(fileName)
+
+ //console.log("filename", fileNames)
+ const fileData = {
+ id:slug
+ }
+
//console.log("AllBacklinks slug", slug)
// Read markdown file as string
- const fileContent = fs.readFileSync(fileName, 'utf8')
-
- const [htmlContent, backlinks] = Remark.getHtmlContent(fileContent, {
+ 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
- if (backlinks.length > 0){
- //console.log("backlinks",[ slug, [backlinks]] )
- //bimap.push(slug, backlinks)
+ })
+ // 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))
- // Check if internal link exists
- const internalLinks = backlinks.filter(bl => fileNames.includes(bl))
- backlinkList.push([slug, internalLinks])
- //console.log("bimap: ", bimap.key(slug))
- }
+ // Combine the data with the slug
+ //return backlinkList.length > 0 ? JSON.stringify(backlinkList) : null
+ })
- // Combine the data with the slug
- return backlinkList.length > 0 ? JSON.stringify(backlinkList) : null
- })
-
- return [allBacklinkData.filter(bl => bl !== null), JSON.stringify(fileNames)]
+ //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() {
- // Get file names under /posts
- const filePaths = Node.getFiles(postsDirectory).filter(fn => fn.endsWith(".md"))
- const fileNames = filePaths.map(f => f.split("/")[f.split("/").length - 1].replace(".md", ""))
- //console.log("filePaths", filePaths)
+ //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(fileName => {
- //console.log("filename", fileNames)
- // Remove ".md" from file name to get id
- const slug = fileName.replace(/\.md$/, '').split("/")[fileName.split("/").length - 1]
- //console.log("slug", slug)
+ 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
- const fileContent = fs.readFileSync(fileName, 'utf8')
-
- // Use gray-matter to parse the post metadata section
- const matterResult = Remark.getFrontMatterData(fileContent)// matter(fileContent).data
- const permalink = matterResult.permalink
- const content = fileContent.split("---\n")[fileContent.split("---").length -1 ]
+ // 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....")
- // Combine the data with the slug
- return {
- id:slug.toLowerCase().split(" ").join("-"),
- ...matterResult,
- }
- })
+ //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
}
\ No newline at end of file
diff --git a/lib/remark.js b/lib/remark.js
deleted file mode 100644
index 082b46e..0000000
--- a/lib/remark.js
+++ /dev/null
@@ -1,58 +0,0 @@
-import matter from 'gray-matter'
-var remark = require('remark')
-import path from 'path'
-import fs from "fs"
-import remark2react from 'remark-react'
-
-const unified = require('unified')
-const markdown = require('remark-parse')
-const { wikiLinkPlugin } = require('remark-wiki-link');
-
-var guide = require('remark-preset-lint-markdown-style-guide')
-var html = require('remark-html')
-var report = require('vfile-reporter')
-var frontmatter = require('remark-frontmatter')
-
-
-
-const postsDirectory = path.join(process.cwd(), 'posts')
-const isFile = fileName => {
- return fs.lstatSync(fileName).isFile()
-}
-
-export const Remark = {
- getFrontMatterData:function(filecontent){return matter(filecontent).data},
-
- getHtmlContent:function(content, {fileNames}){
- let htmlContent = []
- let backlinks = []
- unified()
- .use(markdown, { gfm: true })
- .use(frontmatter, ['yaml', 'toml'])
- .use(wikiLinkPlugin, {
- permalinks:fileNames,
- pageResolver: function(pageName){
- const name = [pageName.replace(/ /g, "-").toLowerCase()]
- backlinks.push(name[0]);
- //console.log("backlinks", backlinks);
- return name
- },
- hrefTemplate: function(permalink){
- //console.log("wiki pemalink", permalink);
- permalink = permalink.replace("ç","c").replace("ı","i").replace("ş","s")
- return `/note/${permalink}`
- }
- }).use(html)
- .process(content,
- function (err, file) {
- //console.log("asd", String(file).slice(0,50))
- //console.error("remark: ", report(err || file))
- htmlContent.push(String(file).replace("\n", ""))
- }
- )
- htmlContent = htmlContent.join("")
- htmlContent = htmlContent.split("---")
- //console.log("ffffff ", htmlContent)
- return [htmlContent, backlinks]
- }
-}
diff --git a/lib/transformer.js b/lib/transformer.js
new file mode 100644
index 0000000..d4b77f0
--- /dev/null
+++ b/lib/transformer.js
@@ -0,0 +1,143 @@
+import matter from 'gray-matter'
+import path from 'path'
+import fs from "fs"
+var remark = require('remark')
+//import remark2react from 'remark-react'
+
+var remark2react = require("remark-react");
+const unified = require('unified')
+const markdown = require('remark-parse')
+const { wikiLinkPlugin } = require('remark-wiki-link');
+
+var guide = require('remark-preset-lint-markdown-style-guide')
+var html = require('remark-html')
+var report = require('vfile-reporter')
+var vfile = require('to-vfile')
+var frontmatter = require('remark-frontmatter')
+var stringify = require('remark-stringify')
+var externalLinks = require('remark-external-links')
+const highlight = require('remark-highlight.js')
+
+
+const postsDirectory = path.join(process.cwd(), 'posts')
+const isFile = fileName => {
+ return fs.lstatSync(fileName).isFile()
+}
+
+export const Transformer = {
+ haveFrontMatter:function(content){
+ //console.log("\t Front matter data content", content)
+ if (!content) return false
+ var indexOfFirst = content.indexOf("---")
+ //console.log("\t Front matter data firstIndex ", indexOfFirst)
+ //console.log("index first", indexOfFirst)
+ if (indexOfFirst === -1){
+ return false
+ }
+ var indexOfSecond = content.indexOf("---", (indexOfFirst + 1))
+ if (indexOfSecond !== -1) {
+ return true
+ }
+ return false
+ },
+ getFrontMatterData:function(filecontent){
+ if (Transformer.haveFrontMatter(filecontent)){
+ return matter(filecontent).data
+ }
+ return {}
+ },
+
+
+ getHtmlContent:function(content, {fileNames}){
+ let htmlContent = []
+ let internalLinks = []
+ const sanitizedContent = Transformer.preprocessThreeDashes(content)
+ unified()
+ .use(markdown, { gfm: true })
+ .use(highlight)
+ .use(externalLinks, {target: "_blank", rel: ['nofollow']})
+ .use(frontmatter, ['yaml', 'toml'])
+ .use(wikiLinkPlugin, {
+ permalinks:fileNames,
+ pageResolver: function(pageName){
+ const name = [Transformer.parseFileNameFromPath(pageName)]
+ //console.log("\n\nwiki internal links", Transformer.parseFileNameFromPath(name[0]));
+ internalLinks.push(Transformer.parseFileNameFromPath(name[0]));
+ return name
+ },
+ hrefTemplate: function(permalink){
+ permalink = Transformer.normalizeFileName(permalink)
+ permalink = permalink.replace("ç","c").replace("ı","i").replace("ş","s")
+ //console.log("wiki pemalink", permalink);
+ return `/note/${permalink}`
+ }
+ }).use(html)
+ .process(sanitizedContent,
+ function (err, file) {
+ //console.log("asd", String(file).slice(0,50))
+ //console.error("remark: ", report(err || file))
+ htmlContent.push(String(file).replace("\n", ""))
+ }
+ )
+ htmlContent = htmlContent.join("")
+ htmlContent = htmlContent.split("---")
+ //console.log("ffffff ", htmlContent)
+ return [htmlContent, internalLinks]
+ },
+
+ /* SANITIZE MARKDOWN FOR --- */
+ preprocessThreeDashes:function(content){
+ var indexOfFirst = content.indexOf("---")
+ if (indexOfFirst === -1){
+ return content
+ }
+ var indexOfSecond = content.indexOf("---", (indexOfFirst + 1))
+ const frontPart = content.slice(0, indexOfSecond);
+ const contentPart = content.slice(indexOfSecond);
+ const processedContent = contentPart.split("---").join("")
+ //console.log("preprocess", indexOfFirst, indexOfSecond)
+ //return frontPart.concat(processedContent)
+ return processedContent
+ },
+
+ /* Normalize File Names */
+ normalizeFileName:function(filename){
+ var processedFileName = filename.replace(".md", "")
+ processedFileName = processedFileName.split(" ").join("-")
+ processedFileName = processedFileName.toLowerCase()
+ const conversionLetters = [["ç", "c"], ["ş","s"], ["ı", "i"], ["ü","u"], ["ö","o"], ["ğ","g"]];
+ conversionLetters.forEach(letterPair => {
+ processedFileName = processedFileName.replace(letterPair[0], letterPair[1])
+ }
+ )
+ //console.log("filename", processedFileName)
+ return processedFileName
+ },
+ /* Parse file name from path then sanitize it */
+ parseFileNameFromPath:function(filepath){
+ const parsedFileFromPath = filepath.split("/")[filepath.split("/").length - 1]
+ const parsedFileName = parsedFileFromPath.replace(".md", "")
+ return Transformer.normalizeFileName(parsedFileName)
+ },
+
+ /* Pair provided and existing Filenames*/
+ pairCurrentFile: function(provided, ListOfFilePaths){
+ //console.log(provided, ListOfFilePaths)
+ const providedSanitizedFileName = Transformer.normalizeFileName(provided);
+
+ // Map file paths and return true if it pairs with provided
+ const possibleFilePath = ListOfFilePaths.filter(possibleFilePath => {
+ const possibleFileName = Transformer.parseFileNameFromPath(possibleFilePath);
+ const possibleSanitizedFileName = Transformer.normalizeFileName(possibleFileName)
+ //console.log("----", providedSanitizedFileName, possibleSanitizedFileName)
+
+ //console.log("---", possibleSanitizedFileName, providedSanitizedFileName)
+ if (providedSanitizedFileName === possibleSanitizedFileName){
+ return true
+ }
+ return false
+ })
+ //console.log("p---", possibleFilePath)
+ return possibleFilePath[0]
+ }
+}
diff --git a/package.json b/package.json
index 3fce826..70b3767 100644
--- a/package.json
+++ b/package.json
@@ -8,6 +8,9 @@
"start": "next start"
},
"dependencies": {
+ "cytoscape-d3-force": "^1.1.4",
+ "cytoscape-node-html-label": "^1.2.1",
+ "d3": "^6.2.0",
"fs": "^0.0.1-security",
"gray-matter": "^4.0.2",
"jsnetworkx": "^0.3.4",
@@ -16,16 +19,21 @@
"react": "16.13.1",
"react-dom": "16.13.1",
"remark": "^13.0.0",
+ "remark-external-links": "^8.0.0",
+ "remark-highlight.js": "^6.0.0",
"remark-html": "^13.0.1",
"remark-parse": "^9.0.0",
"remark-preset-lint-markdown-style-guide": "^4.0.0",
"remark-wiki-link": "^1.0.0",
+ "to-vfile": "^6.1.0",
"unified": "^9.2.0",
"vfile-reporter": "^6.0.1"
},
"devDependencies": {
"bimap": "^0.0.15",
+ "cytoscape": "^3.17.0",
"remark-frontmatter": "^3.0.0",
- "remark-react": "^8.0.0"
+ "remark-react": "^8.0.0",
+ "remark-stringify": "^9.0.0"
}
}
diff --git a/pages/_app.js b/pages/_app.js
index 17b1fe5..ef05811 100644
--- a/pages/_app.js
+++ b/pages/_app.js
@@ -3,5 +3,6 @@ import '../styles/webflow-layout.css'
export default function App({ Component, pageProps }) {
- return
+
+ return
}
diff --git a/pages/_document.js b/pages/_document.js
index b61eb25..ce31d56 100644
--- a/pages/_document.js
+++ b/pages/_document.js
@@ -1,42 +1,46 @@
import Document, { Html, Head, Main, NextScript } from 'next/document'
+import { useRouter } from 'next/router'
+import { useMemo } from "react";
import { getSinglePost } from "../lib/post";
-import Link from 'next/link'
+import Link from 'next/link';
class MyDocument extends Document {
+
static async getInitialProps(ctx) {
const initialProps = await Document.getInitialProps(ctx)
+ //console.log("doc", initialProps)
const sidebar = getSinglePost("sidebar.md")
-
- //console.log("document: ", sidebar)
return { sidebar, ...initialProps }
}
-
+
render(props) {
+ //console.log("document: ", this.props)
return (
-
-
-
+
- {/* NAVBAR */}
-
-
@@ -45,16 +49,19 @@ class MyDocument extends Document {
data-w-id="71d5791f-856a-b6c4-e8ee-0ab2729e1de3"
className="sidebar"
id="sidebar"
- dangerouslySetInnerHTML={{__html:this.props.sidebar.data}}
+
>
+
+
{/* CONTENT */}
-
+
+
diff --git a/pages/index.js b/pages/index.js
index e3d3c47..1947a4e 100644
--- a/pages/index.js
+++ b/pages/index.js
@@ -1,28 +1,37 @@
import Head from "next/head";
+import { useRouter } from 'next/router'
import { useEffect,useRef } from "react";
import Link from 'next/link'
import Layout, { siteTitle } from "../components/layout";
-import { getSinglePost, getAllBacklinks } from "../lib/post";
-var jsnx = require('jsnetworkx');
+import { getSinglePost, getGraphData } from "../lib/post";
+import { Network } from "../components/graph";
-export default function Home({ content, backlinks, filenames }) {
+
+export default function Home({ content, graphdata, filenames, ...props }) {
+ //console.log("Index Page Props: ", props /* backlinks, filenames*/)
const ref = useRef(null);
- //console.log("Index Page Props: ", backlinks, filenames)
+ const router = useRouter()
+
//var G = jsnx.binomialGraph(filenames.length, 1)
//var G = jsnx.completeGraph(filenames.length);
useEffect(() => {
+ if (ref && ref.current){
- })
+ const G = Network({el:ref.current, graphdata, current:"index", router, allNodes:true})
+ }
+ }, [])
return (
- …
-
-
-
+
+
+
+
+
+
+
+
);
@@ -30,11 +39,11 @@ export default function Home({ content, backlinks, filenames }) {
export function getStaticProps() {
const contentData = getSinglePost("index.md");
- const [backlinksRaw, filenamesRaw] = getAllBacklinks();
+ const graphdata = getGraphData();
return {
props: {
content:contentData,
- //backlinks:JSON.parse(backlinksRaw),
+ graphdata:graphdata,
//filenames:JSON.parse(filenamesRaw)
//sidebar:sidebarData
},
diff --git a/pages/note/[id].js b/pages/note/[id].js
index 837b718..4b098f9 100644
--- a/pages/note/[id].js
+++ b/pages/note/[id].js
@@ -1,29 +1,76 @@
import Head from "next/head";
import Link from 'next/link'
-
+import { useRouter } from 'next/router'
+import { useEffect,useRef } from "react";
import Layout, { siteTitle } from "../../components/layout";
-import { getPostListData, getSinglePost} from "../../lib/post";
+import { getPostListData, getSinglePost, getGraphData} from "../../lib/post";
+import { Network } from "../../components/graph";
+import Cytoscape from "cytoscape";
+
+
+export default function Home({ note, graphdata, ...props }) {
+ var jsnx = require('jsnetworkx');
+
+ //console.log("Note Page: ")
+ //console.log("Index Page Props: ", props /* backlinks, filenames*/)
+
+ const backlinks = graphdata.filter(g => g.data.target === note.id)
+
+ const ref = useRef(null);
+ const router = useRouter()
+ var G;
+ useEffect(() => {
+ if (ref && ref.current){
+ G = Network({el:ref.current, graphdata, current:note.id, router, allNodes:false})
+ }
+}, [])
+
+ useEffect(() => {
+ if (backlinks.length > 0){
+ const sideBox = document.getElementById("side-graph-box");
+ const Backlink = (data) => (
+
+ )
+
+ //sideBox
+ }
+ },[])
+
-export default function Home({ note }) {
- console.log("Note Page: ", note)
return (
- …
+
+ {note.title && }
+ {note.canonical && }
+ {note.description && }
+
+
+ {note.title && {note.title}
}
+
+
+
+
);
}
export async function getStaticPaths() {
const allPostsData = await getPostListData();
const paths = allPostsData.map(p => ({params: {id:p.id}}))
- console.log("paths", paths)
+ //console.log("paths", paths)
return {
paths,
fallback:false
@@ -31,10 +78,14 @@ export async function getStaticPaths() {
}
export async function getStaticProps({ params }) {
const note = await getSinglePost(params.id);
- console.log("note: ", note)
+ const graphdata = getGraphData();
+
+
+ //console.log("note: ", params)
return {
props: {
note,
+ graphdata:graphdata,
},
};
}
diff --git a/posts/.obsidian/workspace b/posts/.obsidian/workspace
index 169b89c..a7f3b3f 100644
--- a/posts/.obsidian/workspace
+++ b/posts/.obsidian/workspace
@@ -10,7 +10,7 @@
"state": {
"type": "markdown",
"state": {
- "file": "index.md",
+ "file": "sidebar.md",
"mode": "source"
}
},
@@ -22,7 +22,7 @@
"state": {
"type": "markdown",
"state": {
- "file": "index.md",
+ "file": "sidebar.md",
"mode": "source"
}
},
@@ -82,7 +82,7 @@
"state": {
"type": "backlink",
"state": {
- "file": "index.md",
+ "file": "sidebar.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
@@ -99,11 +99,11 @@
"collapsed": true
},
"lastOpenFiles": [
+ "sidebar.md",
"index.md",
"Code/Codesheet.md",
"Code/JS/Deep Compare.md",
"articles-eng/Untitled.md",
- "sidebar.md",
"Untitled.md"
]
}
\ No newline at end of file
diff --git a/posts/Code/CSS/Frost-Effect.md b/posts/Code/CSS/Frost-Effect.md
index bab9373..30c087b 100644
--- a/posts/Code/CSS/Frost-Effect.md
+++ b/posts/Code/CSS/Frost-Effect.md
@@ -1,3 +1,5 @@
+
+
```css
/* --> Makes backdrop frost-blur effect on a container */
.frost-blur {
diff --git a/posts/Code/Codesheet.md b/posts/Code/Codesheet.md
index 717b807..190d816 100644
--- a/posts/Code/Codesheet.md
+++ b/posts/Code/Codesheet.md
@@ -21,7 +21,7 @@ __CSS Snippets__
__HTML__
-* [[HTTPS Force meta tag|Force Insecure Requrests to HTTPS]]: Güvensiz bağlantıları HTTPS'e zorlar. ``
+* [[HTTPS Force Meta Tag]]: Güvensiz bağlantıları HTTPS'e zorlar.
@@ -35,7 +35,4 @@ __HTML__
-* SEO
-* [[Parameterized URL Index]]: If an indexer can index the link, you get DA93 backlink.
-
\ No newline at end of file
diff --git a/posts/Code/HTML/https-force-meta-tag.md b/posts/Code/HTML/https-force-meta-tag.md
new file mode 100644
index 0000000..a11f666
--- /dev/null
+++ b/posts/Code/HTML/https-force-meta-tag.md
@@ -0,0 +1 @@
+ ``
\ No newline at end of file
diff --git a/posts/Code/Svelte/External Script Loader.md b/posts/Code/Svelte/External Script Loader.md
index 3a878c9..c9bc46c 100644
--- a/posts/Code/Svelte/External Script Loader.md
+++ b/posts/Code/Svelte/External Script Loader.md
@@ -1,4 +1,4 @@
-Bu yöntemi Stackoverflow'da [[blindfish|https://stackoverflow.com/a/61979865/9351362]] yazmış.
+Bu yöntemi Stackoverflow'da [blindfish](https://stackoverflow.com/a/61979865/9351362) yazmış.
```html
// LibLoader.svelte
diff --git a/posts/articles-eng/Collaborative Filtering.md b/posts/articles-eng/Collaborative Filtering.md
index 15a7cc7..cdf234e 100644
--- a/posts/articles-eng/Collaborative Filtering.md
+++ b/posts/articles-eng/Collaborative Filtering.md
@@ -8,7 +8,6 @@ There are many approaches in recommenders systems considering various situations
The basic idea of collaborative filtering is lying on analyzing people's shared interests on domain specific items (in our case, domain items are movies ). Calculating similarity between taste of people or similarity between different items with each other allow us to make a good recommendations. In general, Those recommendations can be item-based and/or user-based.
----
On the rest of this article, to make a good illustration we will consider a hypothetical sitution that are mainly consists of two person; Person A and Person B and two items (movies) Movie X and Movie Y.
diff --git a/posts/articles-eng/Confluence Installation.md b/posts/articles-eng/Confluence Installation.md
index 063a330..361166d 100644
--- a/posts/articles-eng/Confluence Installation.md
+++ b/posts/articles-eng/Confluence Installation.md
@@ -4,6 +4,8 @@ title: Self-Hosted Confluence Installation with Custom Domain
One of our customers from [Seablue](https://www.seabluetours.com) and [AirportTransfer](https://airporttransfer.ist) ask the possibility of using Atlassian Confluence as a self-hosted wiki program. We look for solutions for a while. Later on, we discovered Cloudron app. In this article, We'll install Confluence with a custom domain on our servers.
+[[Test Linki]]
+[[Zettelkasten Metodu]]
### What is Confluence?
Confluence is a team collaboration and wiki software developed by Australian software company Atlassian.
diff --git a/posts/articles-tr/En İyi Blog Siteleri.md b/posts/articles-tr/En İyi Blog Siteleri.md
index 2b87063..ec9818a 100644
--- a/posts/articles-tr/En İyi Blog Siteleri.md
+++ b/posts/articles-tr/En İyi Blog Siteleri.md
@@ -6,7 +6,7 @@ __cover__: https://www.cbsofyalioglu.com/content/images/size/w1000/2020/09/blog-
![Cover](https://www.cbsofyalioglu.com/content/images/size/w1000/2020/09/blog-siteleri.jpg)
----
+
Günlük tutmak, kişisel fikirlerimizi ve kültürel birikimimizi paylaşmak, yazma yeteneğimizi geliştirmek, ürün veya hizmetlerimizi satmak gibi bir çok sebeple her gün sayısız blog yazısı yazılıyor. Siz de ister işletmeniz ister kendiniz için bir tane blog oluşturma fikrine sahipseniz bu yazı size göre.
@@ -14,7 +14,7 @@ Yazının başında ***blog açmak isteyenlere öneriler*** ve dikkat edilmesi
Ayrıca fotoğraf ve illüstrasyon sanatçıları için ayrıca listeye alınan ve dijital ürünlerini satabilecekleri ve foto-blog'larını oluşturabilecekleri bir kaç platform da mevcut.
----
+
### **Ne Tür Blog Platformları İncelenecek?**
@@ -112,7 +112,7 @@ En azından şu hizmetlere bakabiliriz:
- Epost bülteni tasarımı ve gönderilmesi.
- Aylık eposta gönderim limitleri.
----
+
## **En İyi Blog Siteleri**
@@ -136,7 +136,7 @@ Gelelim fiyat kısmına: Ghost' blog kullanmanın maliyeti 29$, tabi eğer Ghost
Ayrıca biraz uğraşmayı göze alırsanız, [Google Cloud Platform üzerinde ücretsiz olarak Ghost blog açmak](https://www.cbsofyalioglu.com/post/ghost-blog/) isimli yazıma bakabilirsiniz. ([[Ghost Blog Açma Rehberi]])
----
+
### **2) SquareSpace**
@@ -165,7 +165,7 @@ Ayrıca tasarım konusunda yalnızca size sunulan şablonları özelleştirmekle
Toplam 70'den fazla hazır web sitesi şablonuna sahip yeterli gibi gözüküyor ancak gene de daha fazla olabilirdi.
----
+
### **3) HashNode**
@@ -183,7 +183,7 @@ Markdown editörlü bu sitede yalnızca yazılarınızı paylaşabilir ve bir ka
Diğer ücretsiz blog sitelerinden HashNode'u ayıran şey kendi özel alan adınızı da ücretsiz olarak bağlamanıza izin veriyor oluşu.
----
+
### **4) WebFlow**
@@ -199,7 +199,7 @@ Ayrıca dahili Lottie animasyon deteğine sahip olduğunu da belitrtmek lazım.
Webflow fiyatlandırmayı 2 genel kategori üzerinden yapıyor. $12'lık paket ile kendi alan adınızı bağlayabilirsiniz. Bir diğer kategori ise "Account Plan" adı altında sunulan ve daha çok freelancer, geliştiriciler ve ajanslar için uygun olan kategori. Bu kategori daha çok aynı anda kaç proje barındırabileceğiniz ve yatığınız projelerin kodlarını dışarı çıkartmak için geçerli.
----
+
### **5) Wix**
@@ -215,7 +215,7 @@ Ayrıca 500'den fazla hazır şablona sahip ve bunları ücretsiz kullanabiliyor
Yapay zeka destekli editörünün yanında normal editör ve EditorX dahil 3 editöre sahip.
----
+
### **6) Visual Society**
diff --git a/posts/articles-tr/Zettelkasten Metodu.md b/posts/articles-tr/Zettelkasten Metodu.md
index 769a46b..892e09e 100644
--- a/posts/articles-tr/Zettelkasten Metodu.md
+++ b/posts/articles-tr/Zettelkasten Metodu.md
@@ -1,9 +1,8 @@
---
title: Zettelkasten Metodu ile Akıllı Not-Alma
description: Zettelkasten metodu ve üretkenliğinizi arttıracak not alma yöntemleri.
-canonical: [https://www.cbsofyalioglu.com/post/zettelkasten-metodu/](https://www.cbsofyalioglu.com/post/zettelkasten-metodu/)
-
-cover:[https://cbsofyalioglucom.imfast.io/zettelkasten/zettelkasten.jpg](https://cbsofyalioglucom.imfast.io/zettelkasten/zettelkasten.jpg)
+canonical: https://www.cbsofyalioglu.com/post/zettelkasten-metodu/
+cover: https://cbsofyalioglucom.imfast.io/zettelkasten/zettelkasten.jpg
---
![https://cbsofyalioglucom.imfast.io/zettelkasten/zettelkasten.jpg](https://cbsofyalioglucom.imfast.io/zettelkasten/zettelkasten.jpg)
@@ -15,6 +14,7 @@ cover:[https://cbsofyalioglucom.imfast.io/zettelkasten/zettelkasten.jpg](https:/
+[[Confluence Installation]]
Her taraftan bilgi bombardımanına tutulmaya pek ala alıştık artık. Akıllı telefonlar ve sosyal medya uygulamaları derken artık çok daha niş içerikler tüketmemize olanak veren ve bu dar bağlamın da dışına çıkmamamız için de yeterli içeriği bize sunabilecek uygulamalar da fazlasıyla mevcut. (Flipboard, Medium, Feedly, Paper.li gibi)
diff --git a/posts/sidebar.md b/posts/sidebar.md
index 4857616..e49236d 100644
--- a/posts/sidebar.md
+++ b/posts/sidebar.md
@@ -1,3 +1,7 @@
+---
+title: "Sidebar"
+---
### [Digital Notes](/)
-* [[Zettelkasten Metodu]]
\ No newline at end of file
+* [[Zettelkasten Metodu]]
+* [[Codesheet]]
\ No newline at end of file
diff --git a/settings.json b/settings.json
new file mode 100644
index 0000000..0cc7f5a
--- /dev/null
+++ b/settings.json
@@ -0,0 +1,3 @@
+{
+ "title":"Digital Backrom"
+}
\ No newline at end of file
diff --git a/styles/webflow-layout.css b/styles/webflow-layout.css
index 5b604d3..a4d59cf 100644
--- a/styles/webflow-layout.css
+++ b/styles/webflow-layout.css
@@ -47,6 +47,9 @@ p,a, li, h1, h2,h3,h4,h5,h6 {
ul, ol {padding-left: 16px;}
+
+
+
a {text-decoration: none;color:#222 !important}
a.internal {
color: #131313 ;
@@ -66,7 +69,61 @@ a.internal:hover {
rgba(0, 255, 85, 0.7) calc(50% - 9px));
background-position: 0px 100%;
}
+.main a:not(.internal) {
+ color: #131313 ;
+ background-color: transparent !important;
+ background-image: linear-gradient(transparent 0%,transparent calc(50% - 9px),rgba(75, 58, 225, 0.631) calc(50% - 9px), rgba(0,255,0,0.35) 100%);
+ background-position: 0px 0px;
+ background-size: 100% 200%;
+ font-weight: bold;
+ border-radius: 4px;
+ padding: 2px 4px;
+ transition: all 0.2s ease-out;
+}
+.main a.internal.new, .sidebar .main a.internal.new {
+ color: #131313 ;
+ background-color: transparent !important;
+ background-image: linear-gradient(transparent 0%,transparent calc(50% - 9px),rgba(250, 51, 54, 0.631) calc(50% - 9px), rgba(0,255,0,0.35) 100%);
+ background-position: 0px 0px;
+ background-size: 100% 200%;
+ font-weight: bold;
+ border-radius: 4px;
+ padding: 2px 4px;
+ transition: all 0.2s ease-out;
+}
+.test {
+ color: #5221c4;
+}
+#graph-box {
+ width: 100%;
+ margin-top: 32px;
+ margin-bottom:64px;
+ min-height:400px;
+ background-color: #29203d;
+ border-radius: 8px;
+ box-shadow: 0 4px 8px 1px rgba(0, 0, 0, 0.3);
+}
+#side-graph-box {
+ width: 100%;
+ margin-top: 32px;
+ margin-bottom:64px;
+ /*
+ min-height:250px;
+ */
+ background-color: #29203d;
+ border-radius: 8px;
+ box-shadow: 0 4px 8px 1px rgba(0, 0, 0, 0.3);
+}
+
+#side-graph-box label {
+ margin: 32px 0 !important;
+}
+.jsnx .node-label { fill: white !important;font-size:12px;}
+.jsnx g.node {height:60px !important;}
+
+
+pre code {padding:16px !important; border-radius: 8px;}
img {width:100%; height:auto; margin-top:16px; margin-bottom:48px; border-radius: 8px; box-shadow: 0 4px 8px -1px rgba(0, 0, 0, 0.3);}
.sidebar h3,.sidebar h4 {margin-top:16px;}
.w-nav-brand {color:#333333; text-decoration: none;}
@@ -110,7 +167,7 @@ img {width:100%; height:auto; margin-top:16px; margin-bottom:48px; border-radius
display: flex;
height: 100%;
min-height: 100vh;
- min-width: 250px;
+ min-width: 350px;
padding: 32px 16px;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
@@ -132,7 +189,7 @@ img {width:100%; height:auto; margin-top:16px; margin-bottom:48px; border-radius
.main {
position: relative;
- left: 250px;
+ left: 350px;
z-index: 0;
width: 100%;
min-height: 100vh;
@@ -181,18 +238,25 @@ img {width:100%; height:auto; margin-top:16px; margin-bottom:48px; border-radius
.navbar {
display: none;
+ z-index: 5 !important;
}
}
+
+
+
@media screen and (min-width: 767px) {
.sidebar {left: 0 !important;}
- .main {width: calc(100% - 250px);}
+ .main {width: calc(100% - 350px);}
}
@media screen and (max-width: 767px) {
.sidebar {
- position: absolute;
- left: -250px;
+ position: fixed;
+ top:0;
+ z-index: 1;
+ left: -350px;
box-shadow: 3px 3px 8px -2px rgba(0, 0, 0, 0.3);
+ padding-top:96px;
}
.main {
@@ -222,7 +286,10 @@ img {width:100%; height:auto; margin-top:16px; margin-bottom:48px; border-radius
display: block;
background-color: #fff;
}
-
+ #navbar {
+ position: relative;
+ z-index: 5 !important;
+ }
.brand-3 {
display: -webkit-box;
display: -webkit-flex;
diff --git a/yarn.lock b/yarn.lock
index 2de4c27..068239c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -994,7 +994,7 @@ comma-separated-tokens@^1.0.0:
resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea"
integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==
-commander@^2.20.0:
+commander@2, commander@^2.20.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -1222,6 +1222,266 @@ cyclist@^1.0.1:
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
+cytoscape-d3-force@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/cytoscape-d3-force/-/cytoscape-d3-force-1.1.4.tgz#72d2ff888a6eb5072916e903a08bdbe2cea1cd1b"
+ integrity sha512-8NjI/yEoB3YqVsdf7ud7Oh8Kyi+C9Lhh1fICmtemIo6EC1ZUtm8KcPNLkQySYO8nRS2mQKj5eVdCr7W0L8ONoQ==
+ dependencies:
+ d3-force "^2.0.1"
+
+cytoscape-node-html-label@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/cytoscape-node-html-label/-/cytoscape-node-html-label-1.2.1.tgz#f319dbec6eb7024dadddcdbad88d77c57d8ce2f8"
+ integrity sha512-0IB3xmMKLNm9XFb6L3NVArUd+0J8puSwMMhaeN7VUC58MxMF6IYPWeI4LN+A/8AxZwdv1IFyyitMcvtCq060GA==
+
+cytoscape@^3.17.0:
+ version "3.17.0"
+ resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.17.0.tgz#9dc476636a32e2b6f272ee0620177b933427c571"
+ integrity sha512-zPAB2UVV4QWArs+0UEq0ojYn7riFfz8CjivL67wibE/zdnAE8TTvDO5bFxsShSTutmG+1NkCnTXJjOxfosDMwA==
+ dependencies:
+ heap "^0.2.6"
+ lodash.debounce "^4.0.8"
+
+d3-array@2, d3-array@>=2.5, d3-array@^2.3.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.8.0.tgz#f76e10ad47f1f4f75f33db5fc322eb9ffde5ef23"
+ integrity sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw==
+
+d3-axis@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-2.0.0.tgz#40aebb65626ffe6d95e9441fbf9194274b328a8b"
+ integrity sha512-9nzB0uePtb+u9+dWir+HTuEAKJOEUYJoEwbJPsZ1B4K3iZUgzJcSENQ05Nj7S4CIfbZZ8/jQGoUzGKFznBhiiQ==
+
+d3-brush@2:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-2.1.0.tgz#adadfbb104e8937af142e9a6e2028326f0471065"
+ integrity sha512-cHLLAFatBATyIKqZOkk/mDHUbzne2B3ZwxkzMHvFTCZCmLaXDpZRihQSn8UNXTkGD/3lb/W2sQz0etAftmHMJQ==
+ dependencies:
+ d3-dispatch "1 - 2"
+ d3-drag "2"
+ d3-interpolate "1 - 2"
+ d3-selection "2"
+ d3-transition "2"
+
+d3-chord@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-2.0.0.tgz#32491b5665391180560f738e5c1ccd1e3c47ebae"
+ integrity sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig==
+ dependencies:
+ d3-path "1 - 2"
+
+"d3-color@1 - 2", d3-color@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e"
+ integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==
+
+d3-contour@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-2.0.0.tgz#80ee834988563e3bea9d99ddde72c0f8c089ea40"
+ integrity sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA==
+ dependencies:
+ d3-array "2"
+
+d3-delaunay@5:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-5.3.0.tgz#b47f05c38f854a4e7b3cea80e0bb12e57398772d"
+ integrity sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==
+ dependencies:
+ delaunator "4"
+
+"d3-dispatch@1 - 2", d3-dispatch@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-2.0.0.tgz#8a18e16f76dd3fcaef42163c97b926aa9b55e7cf"
+ integrity sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==
+
+d3-drag@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-2.0.0.tgz#9eaf046ce9ed1c25c88661911c1d5a4d8eb7ea6d"
+ integrity sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w==
+ dependencies:
+ d3-dispatch "1 - 2"
+ d3-selection "2"
+
+"d3-dsv@1 - 2", d3-dsv@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-2.0.0.tgz#b37b194b6df42da513a120d913ad1be22b5fe7c5"
+ integrity sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==
+ dependencies:
+ commander "2"
+ iconv-lite "0.4"
+ rw "1"
+
+"d3-ease@1 - 2", d3-ease@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-2.0.0.tgz#fd1762bfca00dae4bacea504b1d628ff290ac563"
+ integrity sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==
+
+d3-fetch@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-2.0.0.tgz#ecd7ef2128d9847a3b41b548fec80918d645c064"
+ integrity sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw==
+ dependencies:
+ d3-dsv "1 - 2"
+
+d3-force@2, d3-force@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-2.1.1.tgz#f20ccbf1e6c9e80add1926f09b51f686a8bc0937"
+ integrity sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==
+ dependencies:
+ d3-dispatch "1 - 2"
+ d3-quadtree "1 - 2"
+ d3-timer "1 - 2"
+
+"d3-format@1 - 2", d3-format@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767"
+ integrity sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==
+
+d3-geo@2:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-2.0.1.tgz#2437fdfed3fe3aba2812bd8f30609cac83a7ee39"
+ integrity sha512-M6yzGbFRfxzNrVhxDJXzJqSLQ90q1cCyb3EWFZ1LF4eWOBYxFypw7I/NFVBNXKNqxv1bqLathhYvdJ6DC+th3A==
+ dependencies:
+ d3-array ">=2.5"
+
+d3-hierarchy@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz#dab88a58ca3e7a1bc6cab390e89667fcc6d20218"
+ integrity sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==
+
+"d3-interpolate@1 - 2", "d3-interpolate@1.2.0 - 2", d3-interpolate@2:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163"
+ integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==
+ dependencies:
+ d3-color "1 - 2"
+
+"d3-path@1 - 2", d3-path@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8"
+ integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==
+
+d3-polygon@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-2.0.0.tgz#13608ef042fbec625ba1598327564f03c0396d8e"
+ integrity sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==
+
+"d3-quadtree@1 - 2", d3-quadtree@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-2.0.0.tgz#edbad045cef88701f6fee3aee8e93fb332d30f9d"
+ integrity sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==
+
+d3-random@2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-2.2.2.tgz#5eebd209ef4e45a2b362b019c1fb21c2c98cbb6e"
+ integrity sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw==
+
+d3-scale-chromatic@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz#c13f3af86685ff91323dc2f0ebd2dabbd72d8bab"
+ integrity sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==
+ dependencies:
+ d3-color "1 - 2"
+ d3-interpolate "1 - 2"
+
+d3-scale@3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.2.3.tgz#be380f57f1f61d4ff2e6cbb65a40593a51649cfd"
+ integrity sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==
+ dependencies:
+ d3-array "^2.3.0"
+ d3-format "1 - 2"
+ d3-interpolate "1.2.0 - 2"
+ d3-time "1 - 2"
+ d3-time-format "2 - 3"
+
+d3-selection@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-2.0.0.tgz#94a11638ea2141b7565f883780dabc7ef6a61066"
+ integrity sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==
+
+d3-shape@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-2.0.0.tgz#2331b62fa784a2a1daac47a7233cfd69301381fd"
+ integrity sha512-djpGlA779ua+rImicYyyjnOjeubyhql1Jyn1HK0bTyawuH76UQRWXd+pftr67H6Fa8hSwetkgb/0id3agKWykw==
+ dependencies:
+ d3-path "1 - 2"
+
+"d3-time-format@2 - 3", d3-time-format@3:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6"
+ integrity sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==
+ dependencies:
+ d3-time "1 - 2"
+
+"d3-time@1 - 2", d3-time@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.0.0.tgz#ad7c127d17c67bd57a4c61f3eaecb81108b1e0ab"
+ integrity sha512-2mvhstTFcMvwStWd9Tj3e6CEqtOivtD8AUiHT8ido/xmzrI9ijrUUihZ6nHuf/vsScRBonagOdj0Vv+SEL5G3Q==
+
+"d3-timer@1 - 2", d3-timer@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-2.0.0.tgz#055edb1d170cfe31ab2da8968deee940b56623e6"
+ integrity sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==
+
+d3-transition@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-2.0.0.tgz#366ef70c22ef88d1e34105f507516991a291c94c"
+ integrity sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==
+ dependencies:
+ d3-color "1 - 2"
+ d3-dispatch "1 - 2"
+ d3-ease "1 - 2"
+ d3-interpolate "1 - 2"
+ d3-timer "1 - 2"
+
+d3-zoom@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-2.0.0.tgz#f04d0afd05518becce879d04709c47ecd93fba54"
+ integrity sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==
+ dependencies:
+ d3-dispatch "1 - 2"
+ d3-drag "2"
+ d3-interpolate "1 - 2"
+ d3-selection "2"
+ d3-transition "2"
+
+d3@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/d3/-/d3-6.2.0.tgz#f19b0ecb16ca4ad2171ce8b37c63247e71c6f01d"
+ integrity sha512-aH+kx55J8vRBh4K4k9GN4EbNO3QnZsXy4XBfrnr4fL2gQuszUAPQU3fV2oObO2iSpreRH/bG/wfvO+hDu2+e9w==
+ dependencies:
+ d3-array "2"
+ d3-axis "2"
+ d3-brush "2"
+ d3-chord "2"
+ d3-color "2"
+ d3-contour "2"
+ d3-delaunay "5"
+ d3-dispatch "2"
+ d3-drag "2"
+ d3-dsv "2"
+ d3-ease "2"
+ d3-fetch "2"
+ d3-force "2"
+ d3-format "2"
+ d3-geo "2"
+ d3-hierarchy "2"
+ d3-interpolate "2"
+ d3-path "2"
+ d3-polygon "2"
+ d3-quadtree "2"
+ d3-random "2"
+ d3-scale "3"
+ d3-scale-chromatic "2"
+ d3-selection "2"
+ d3-shape "2"
+ d3-time "2"
+ d3-time-format "3"
+ d3-timer "2"
+ d3-transition "2"
+ d3-zoom "2"
+
d@1, d@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
@@ -1297,6 +1557,11 @@ define-property@^2.0.2:
is-descriptor "^1.0.2"
isobject "^3.0.1"
+delaunator@4:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-4.0.1.tgz#3d779687f57919a7a418f8ab947d3bddb6846957"
+ integrity sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==
+
delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
@@ -1954,6 +2219,16 @@ he@1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+heap@^0.2.6:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac"
+ integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=
+
+highlight.js@~10.4.0:
+ version "10.4.0"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.4.0.tgz#ef3ce475e5dfa7a48484260b49ea242ddab823a0"
+ integrity sha512-EfrUGcQ63oLJbj0J0RI9ebX6TAITbsDBLbsjr881L/X5fMO9+oadKzEF21C7R3ULKG6Gv3uoab2HiqVJa/4+oA==
+
hmac-drbg@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@@ -2002,7 +2277,7 @@ https-proxy-agent@5.0.0:
agent-base "6"
debug "4"
-iconv-lite@0.4.24:
+iconv-lite@0.4, iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -2074,6 +2349,11 @@ inline-style-parser@0.1.1:
resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1"
integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==
+is-absolute-url@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
+ integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
+
is-accessor-descriptor@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
@@ -2410,6 +2690,11 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
+
lodash.sortby@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
@@ -2437,6 +2722,14 @@ loose-envify@^1.1.0, loose-envify@^1.4.0:
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
+lowlight@^1.2.0:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.17.0.tgz#a1143b2fba8239df8cd5893f9fe97aaf8465af4a"
+ integrity sha512-vmtBgYKD+QVNy7tIa7ulz5d//Il9R4MooOVh4nkOf9R9Cb/Dk5TXMSTieg/vDulkBkIWj59/BIlyFQxT9X1oAQ==
+ dependencies:
+ fault "^1.0.0"
+ highlight.js "~10.4.0"
+
lru-cache@6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
@@ -3465,6 +3758,17 @@ regex-parser@^2.2.11:
resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58"
integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==
+remark-external-links@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/remark-external-links/-/remark-external-links-8.0.0.tgz#308de69482958b5d1cd3692bc9b725ce0240f345"
+ integrity sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==
+ dependencies:
+ extend "^3.0.0"
+ is-absolute-url "^3.0.0"
+ mdast-util-definitions "^4.0.0"
+ space-separated-tokens "^1.0.0"
+ unist-util-visit "^2.0.0"
+
remark-frontmatter@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz#ca5d996361765c859bd944505f377d6b186a6ec6"
@@ -3473,6 +3777,14 @@ remark-frontmatter@^3.0.0:
mdast-util-frontmatter "^0.2.0"
micromark-extension-frontmatter "^0.2.0"
+remark-highlight.js@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/remark-highlight.js/-/remark-highlight.js-6.0.0.tgz#cb05387ddddeb078f0b61ce6299f6323f05098fc"
+ integrity sha512-eNHP/ezuDKoeh3KV+rWLeBVzU3SYVt0uu1tHdsCB6TUJYHwTNMJWZ5+nU+2fJHQXb+7PtpfGXVtFS9zk/W6qdw==
+ dependencies:
+ lowlight "^1.2.0"
+ unist-util-visit "^2.0.0"
+
remark-html@^13.0.1:
version "13.0.1"
resolved "https://registry.yarnpkg.com/remark-html/-/remark-html-13.0.1.tgz#d5b2d8be01203e61fc37403167ca7584879ad675"
@@ -4100,6 +4412,11 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies:
aproba "^1.1.1"
+rw@1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
+ integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=
+
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
@@ -4727,6 +5044,14 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2"
safe-regex "^1.1.0"
+to-vfile@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/to-vfile/-/to-vfile-6.1.0.tgz#5f7a3f65813c2c4e34ee1f7643a5646344627699"
+ integrity sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==
+ dependencies:
+ is-buffer "^2.0.0"
+ vfile "^4.0.0"
+
toidentifier@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"