forgeplus-react/src/forge/Wiki/api.js

256 lines
6.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Base64 } from 'js-base64';
import fetch from './fetch';
// 获取wiki列表
export function wikiPages(params) {
return fetch({
url: '/api/wiki/wikiPages',
method: 'get',
params
});
}
// 获取单个wiki
export function getWiki(params) {
return fetch({
url: '/api/wiki/getWiki',
method: 'get',
params
});
}
//新增wiki
export function addWiki(data) {
return fetch({
url: '/api/wiki/createWiki',
method: 'post',
data: data
});
}
//更新wiki
export function updateWiki(data) {
return fetch({
url: '/api/wiki/updateWiki',
method: 'PUT',
data: data
});
}
//删除wiki
export function deleteWiki(data) {
return fetch({
url: '/api/wiki/deleteWiki',
method: 'DELETE',
data,
});
}
// 初始化sidebar文件
export async function parseSidebar(wikiList, info){
const sidebarArr = wikiList.filter(item => item.name === '_Sidebar');
let ReInfo = undefined;
if(sidebarArr.length){
// 有sidebar文件执行解析
// 通过getWiki获取sidebar文件内容
await getWiki({
...info,
pageName: '_Sidebar'
}).then(res=>{
if(res && res.message === "200"){
const sidebarCont = Base64.decode(res.data.md_content);
const list = wikiList.filter(item=> sidebarCont.indexOf(`[[${item.name}]]`) === -1 && item.name !== "_Sidebar");
const wikiSidebar = list.map(item=>`\n[[${item.name}]]`).join("");
if(list.length){
// sidebar存在丢失的wiki
updateWiki({
...info,
pageName: '_Sidebar',
title: '_Sidebar',
message: '',
content_base64: Base64.encode(`${sidebarCont}${wikiSidebar}`)
})
}
ReInfo={
menuList: markdownToTree(list.length ? `${sidebarCont}${wikiSidebar}` : sidebarCont),
sidebar: sidebarCont
}
}
})
}else{
// 如果没有wiki目录那么不处理
if(!wikiList.length){
return
}
// 没有sidebar文件根据用户的目录结构进行初始化(\n[[item.name]]结构)
const wikiArr = [];
wikiList.map(item=>{
wikiArr.push(`[[${item.name}]]`)
});
const wikiSidebarStr = wikiArr.join('\n');
await addWiki({
...info,
pageName: '_Sidebar',
title: '_Sidebar',
message: '',
content_base64: Base64.encode(wikiSidebarStr)
})
ReInfo={
menuList: markdownToTree(wikiSidebarStr),
sidebar: wikiSidebarStr
}
}
return ReInfo;
}
export function markdownToTree(markdownText){
const lines = markdownText.split('\n');
let key = -1;
// stack: [{一级目录}{二级目录}]
let stack = [];
let root = {
title: "root",
children: [],
key: key++
}
lines.map((item, index) =>{
const title = item.trim();
const isFile = title.startsWith('[[') && title.endsWith(']]');
const node = {
// 带空格+[[]]或者- 标识
title: item,
children: [],
key: undefined,
// 纯内容
titleStr: isFile ? title.substring(2, title.length - 2) : title.substring(2, title.length),
// 是否是wiki文件
isFile: isFile
}
// level空格的个数(层级)
const level = item.search(/\S/);
if(!level){
node.key = key+"";
key++;
// push根目录
stack = [];
stack.push(node);
root.children.push(node);
}else{
// 解析子目录
// 当前节点的父节点
const parentNode = stack[level-1];
// 当前节点的顶级跟节点
const rootNode = root.children.filter(i => i.key === stack[0].key)[0];
if(level === 1){
// 二级目录
node.key = `${rootNode.key}-${rootNode.children.length}`;
rootNode.children.push(node);
}else{
// 更深的层级 找key = stack最后一个item的key
const parentNodeByRoot = findNodeByKey(rootNode.children, parentNode.key);
node.key = `${parentNodeByRoot.key}-${parentNodeByRoot.children.length}`
parentNodeByRoot && parentNodeByRoot.children.push(node);
}
// 下一个节点的空格个数(层级)
const nextNodeLevel = lines[index+1] && lines[index+1].search(/\S/);
if(nextNodeLevel>level && (title.startsWith('- ') || title.startsWith('* '))){
stack.push(node);
}else if(nextNodeLevel<level){
stack.pop()
}
}
})
return root.children;
}
export function findNodeByKey(list, key){
for (let index = 0; index < list.length; index++) {
const element = list[index];
if (element.key == key) {
return element;
}else if (element.children.length) {
let result = findNodeByKey(element.children, key);
if (result) {
return result;
}
}
}
return undefined;
}
// 找到children中有相同key的数组
export function findBrotherNodesByKey(list, key){
for (let index = 0; index < list.length; index++) {
const element = list[index];
if (element.key == key) {
return list;
}else if (element.children && element.children.length) {
let result = findBrotherNodesByKey(element.children, key);
if (result.length) {
return result;
}
}
}
return [];
}
// 目录结构转md内容
export function treeToMd(treeList){
const list = []
readList(list, treeList)
return list.join('\n');
}
function readList(list, readChildren){
readChildren.map(item=>{
list.push(item.title)
readList(list, item.children)
})
}
export function generateList(list) {
const dataList = [];
generate(list);
function generate(data){
for (let i = 0; i < data.length; i++) {
const node = data[i];
const { key, titleStr } = node;
dataList.push({ key, title: titleStr });
if (node.children) {
generate(node.children);
}
}
}
return dataList;
};
export const getParentKey = (key, tree) => {
let parentKey;
for (let i = 0; i < tree.length; i++) {
const node = tree[i];
if (node.children) {
if (node.children.some(item => item.key === key)) {
parentKey = node.key;
} else if (getParentKey(key, node.children)) {
parentKey = getParentKey(key, node.children);
}
}
}
return parentKey;
};
export function findFirstWiki(list){
for (let index = 0; index < list.length; index++) {
const element = list[index];
if (element.isFile) {
return element;
}else if (element.children.length) {
let result = findFirstWiki(element.children);
if (result) {
return result;
}
}
}
}