This commit is contained in:
Can 2020-11-30 14:29:34 +03:00
parent c84a95a47d
commit e71bbc741e
24 changed files with 1000 additions and 206 deletions

172
components/graph.js Normal file
View File

@ -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 `<div title="${el.title ? el.title : el.id}" style='font-weight:400; margin-top:32px;max-width:180px;font-size:12px;color:white;cursor:pointer;'>${label}</div>`
}}],
{
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;

View File

@ -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(()=>{

View File

@ -27,5 +27,6 @@ export const Node = {
},
readFileSync:function(fullPath){
return fs.readFileSync(fullPath, "utf8")
}
},
}

View File

@ -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
}

View File

@ -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]
}
}

143
lib/transformer.js Normal file
View File

@ -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]
}
}

View File

@ -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"
}
}

View File

@ -3,5 +3,6 @@ import '../styles/webflow-layout.css'
export default function App({ Component, pageProps }) {
return <Component {...pageProps} />
return <Component { ...pageProps} />
}

View File

@ -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 (
<Html data-wf-page="5fb1bacf34bc79d543fcd389" data-wf-site="5fb1bacf34bc79b9c4fcd388">
<link rel="stylesheet"
href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.3.2/styles/default.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.3.2/highlight.min.js"></script>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.3.2/styles/atom-one-dark.min.css" />
<Head />
<script src="https://d3js.org/d3.v6.min.js"></script>
<script src="https://d3js.org/d3.v3.min.js"></script>
<body className="body">
{/* NAVBAR */}
<div data-collapse="medium" data-animation="default" data-duration="400" role="banner" class="navbar w-nav">
<div class="container w-container">
<div data-w-id="d4658744-8b5f-bf5e-9b20-4c31718a793d" class="w-nav-button" >
<div class="w-icon-nav-menu" id="nav-button">
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="#000000" strokeWidth="3.5" strokeLinecap="round" strokeLinejoin="round"><line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg> </div>
{/* NAVBAR */}
<div data-collapse="medium" data-animation="default"
data-duration="400" role="banner" className="navbar w-nav"
id="navbar"
>
<div class="container w-container">
<div data-w-id="d4658744-8b5f-bf5e-9b20-4c31718a793d" class="w-nav-button" >
<div class="w-icon-nav-menu" id="nav-button">
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="#000000" strokeWidth="3.5" strokeLinecap="round" strokeLinejoin="round"><line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg>
</div>
</div>
<Link href="/">
<a class="brand-3 w-nav-brand">
<p class="heading">Digital Backroom</p>
</a>
</Link>
</div>
</div>
<Link href="/">
<a class="brand-3 w-nav-brand">
<p class="heading">Digital Backroom</p>
</a>
</Link>
</div>
</div>
<section className="section">
@ -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}}
>
<div dangerouslySetInnerHTML={{__html:this.props.sidebar.data}} />
<div id="side-graph-box" />
</div>
{/* CONTENT */}
<main className="main">
<Main/>
<Main ppp="" />
</main>
</section>
<NextScript />
</body>
</Html>

View File

@ -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 (
<Layout home>
<Head></Head>
<section
>
<div
dangerouslySetInnerHTML={{__html: content.data}}
></div>
<div id="demo-canvas" ref={ref}></div>
<Head></Head>
<img src="https://cbsofyalioglu.fra1.digitaloceanspaces.com/cbs/digital-garden.jpg" />
<section>
<div dangerouslySetInnerHTML={{__html: content.data}} />
</section>
<hr/>
<div id="graph-box" ref={ref}>
</div>
</Layout>
);
@ -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
},

View File

@ -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) => (
<div className="backlink-box">
<Link href={data.id === "index" ? "/" : `/note/${data.id}`}>
<a>
{data.title ? data.title : data.id}
</a>
</Link>
</div>
)
//sideBox
}
},[])
export default function Home({ note }) {
console.log("Note Page: ", note)
return (
<Layout home>
<Head></Head>
<Head>
{note.title && <meta name="title" content={note.title} />}
{note.canonical && <meta name="canonical_url" content={note.canonical} />}
{note.description && <meta name="description" content={note.description} />}
</Head>
<section
>
{note.title && <h1>{note.title}</h1>}
<div
className="article-body"
dangerouslySetInnerHTML={{__html:note.data}}>
</div>
</section>
<hr/>
<div id="graph-box" ref={ref}>
</div>
</Layout>
);
}
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,
},
};
}

View File

@ -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"
]
}

View File

@ -1,3 +1,5 @@
```css
/* --> Makes backdrop frost-blur effect on a container */
.frost-blur {

View File

@ -21,7 +21,7 @@ __CSS Snippets__
<br/>
__HTML__
* [[HTTPS Force meta tag|Force Insecure Requrests to HTTPS]]: Güvensiz bağlantıları HTTPS'e zorlar. `<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">`
* [[HTTPS Force Meta Tag]]: Güvensiz bağlantıları HTTPS'e zorlar.
<br/>
@ -35,7 +35,4 @@ __HTML__
<br/>
* SEO
* [[Parameterized URL Index]]: If an indexer can index the link, you get DA93 backlink.
<br/>

View File

@ -0,0 +1 @@
`<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">`

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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**

View File

@ -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:/
<br/>
[[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)

View File

@ -1,3 +1,7 @@
---
title: "Sidebar"
---
### [Digital Notes](/)
* [[Zettelkasten Metodu]]
* [[Zettelkasten Metodu]]
* [[Codesheet]]

3
settings.json Normal file
View File

@ -0,0 +1,3 @@
{
"title":"Digital Backrom"
}

View File

@ -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;

329
yarn.lock
View File

@ -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"