mirror of
https://github.com/MatMoul/dokytree.git
synced 2025-11-21 06:52:05 +00:00
150 lines
4.0 KiB
JavaScript
150 lines
4.0 KiB
JavaScript
import fs from 'fs'
|
|
import path from 'path'
|
|
import YAML from 'yaml'
|
|
import utils from './utils.js'
|
|
|
|
const load = (yamlFile) => {
|
|
const docu = {
|
|
settings: {
|
|
rootPath: '',
|
|
templates: 'templates',
|
|
doc: 'doc',
|
|
html: 'html',
|
|
style: '',
|
|
server: {
|
|
port: 3000,
|
|
bind: '127.0.0.1',
|
|
},
|
|
},
|
|
root: {
|
|
name: '',
|
|
title: '',
|
|
toc: false,
|
|
book:false,
|
|
url: '/',
|
|
templates: {
|
|
node: '@node',
|
|
items: '@item',
|
|
},
|
|
parent: null,
|
|
nodes: [],
|
|
items: [],
|
|
},
|
|
}
|
|
|
|
if(! fs.existsSync(yamlFile)) return docu
|
|
|
|
const yamlDocu = YAML.parse(fs.readFileSync(yamlFile, 'utf8'))
|
|
docu.settings.rootPath = path.resolve(path.dirname(yamlFile))
|
|
if(yamlDocu) {
|
|
if(yamlDocu.templates) docu.settings.templates = yamlDocu.templates
|
|
if(yamlDocu.doc) docu.settings.doc = yamlDocu.doc
|
|
if(yamlDocu.html) docu.settings.html = yamlDocu.html
|
|
if(yamlDocu.style) {
|
|
if(fs.existsSync(path.join(docu.settings.rootPath, docu.settings.html, yamlDocu.style))){
|
|
docu.settings.style = yamlDocu.style
|
|
}
|
|
}
|
|
if(yamlDocu?.server?.port) docu.settings.server.port = yamlDocu.server.port
|
|
if(yamlDocu?.server?.bind) docu.settings.server.bind = yamlDocu.server.bind
|
|
}
|
|
|
|
const loadNode = (nodePath, parentNode) => {
|
|
if(! fs.existsSync(path.join(nodePath, '_index.yaml'))) return null
|
|
|
|
const nodePathParts = nodePath.split(path.sep)
|
|
const nodeName = (parentNode)?nodePathParts[nodePathParts.length - 1]:'root'
|
|
const node = {
|
|
index: 100,
|
|
name: nodeName,
|
|
title: nodeName,
|
|
toc: true,
|
|
book: true,
|
|
url: (!parentNode)?'/':nodePath.substring(path.join(docu.settings.rootPath, docu.settings.doc).length).replaceAll('\\', '/'),
|
|
templates: {
|
|
node: '@node',
|
|
items: '@item',
|
|
},
|
|
parent: parentNode,
|
|
nodes: [],
|
|
items: [],
|
|
}
|
|
node.getNode = (name) => {
|
|
return getNode(node, name)
|
|
}
|
|
node.getItem = (name) => {
|
|
return getItem(node, name)
|
|
}
|
|
|
|
const yamlNode = YAML.parse(fs.readFileSync(path.join(nodePath, '_index.yaml'), 'utf8'))
|
|
if(yamlNode) {
|
|
if(yamlNode.index) node.index = yamlNode.index
|
|
if(yamlNode.title) node.title = yamlNode.title
|
|
if(yamlNode.toc == false) node.toc = yamlNode.toc
|
|
if(yamlNode.book == false) node.book = yamlNode.book
|
|
if(yamlNode?.templates?.node) node.templates.node = yamlNode.templates.node
|
|
if(yamlNode?.templates?.items) node.templates.items = yamlNode.templates.items
|
|
if(yamlNode.headfiles) node.headfiles = yamlNode.headfiles
|
|
if(yamlNode.files) node.files = yamlNode.files
|
|
if(yamlNode.footfiles) node.footfiles = yamlNode.footfiles
|
|
}
|
|
|
|
utils.getDirs(nodePath).forEach((directory) => {
|
|
loadNode(path.join(nodePath, directory), node)
|
|
})
|
|
utils.getFiles(nodePath, 'yaml').forEach((file) => {
|
|
if(file !== '_index.yaml') loadItem(path.join(nodePath, file), node)
|
|
})
|
|
|
|
node.nodes = node.nodes.sort((a, b) => {
|
|
return a.index - b.index
|
|
})
|
|
|
|
if(parentNode) parentNode.nodes.push(node)
|
|
else docu.root = node
|
|
|
|
return node
|
|
}
|
|
|
|
const loadItem = (itemPath, parentNode) => {
|
|
const itemPathParts = itemPath.split(path.sep)
|
|
const itemFileName = itemPathParts[itemPathParts.length - 1]
|
|
const itemName = itemFileName.substring(0, itemFileName.length - 5)
|
|
const item = {
|
|
name: itemName,
|
|
title: itemName,
|
|
toc: false,
|
|
book: true,
|
|
url: parentNode.url + '?itm=' + itemName,
|
|
data: {}
|
|
}
|
|
const yamlItem = YAML.parse(fs.readFileSync(itemPath, 'utf8'))
|
|
if(yamlItem) item.data = yamlItem
|
|
if(item.data.name) item.title = item.data.name
|
|
else item.data.name = item.name
|
|
if(!item.data.title) item.data.title = item.title
|
|
if(item.data.toc) item.toc = item.data.toc
|
|
if(item.data.book) item.book = item.data.book
|
|
|
|
parentNode.items.push(item)
|
|
|
|
return item
|
|
}
|
|
|
|
loadNode(path.join(docu.settings.rootPath, docu.settings.doc))
|
|
|
|
return docu
|
|
}
|
|
|
|
const getNode = (node, nodeName) => {
|
|
return node.nodes.find(itm => itm.name === nodeName)
|
|
}
|
|
const getItem = (node, itemName) => {
|
|
return node.items.find(itm => itm.name === itemName)
|
|
}
|
|
|
|
export default {
|
|
load,
|
|
// getItem,
|
|
}
|