node.js 读目录.txt文件,用 xml2js 转换为json数据,生成jstree所需的文件

请参阅:java : pdfbox 读取 PDF文件内书签

请注意:书的目录.txt 编码:UTF-8,推荐用 Notepad++ 转换编码。

npm install elementtree ;

npm install xml2js ;

node.js 用 elementtree读目录.txt文件,用 xml2js 转换为json数据,ejs 生成 jstree模板所需的文件。

编写 txt_etree_json.js 如下

javascript 复制代码
// 读目录.txt文件,用xml2js 转换为json数据,生成jstree所需的文件
let fs = require('fs');
let process = require('process');
let path = require('path');
let readline = require('readline');
let et = require('elementtree');
let XML = et.XML;
let ElementTree = et.ElementTree;
//  element = et.Element;
let subElement = et.SubElement;
let xml2js = require('xml2js');
let ejs = require('ejs');

if (process.argv.length <3){
    console.error("usage: node txt_etree_json.js file1.txt");
    return 1;
}
let file1 = process.argv[2];
if (! fs.statSync(file1).isFile()) {
    console.error("it is not File.");
    return 2;
}
let ext = path.extname(file1);
if (ext.toLowerCase() != '.txt'){
    console.error(ext +" is not .txt");
    return 3;
}

let file2 = file1.replace('.txt', '.htm');
console.log(file2);
let fRead = fs.createReadStream(file1);
let fWrite = fs.createWriteStream(file2);
// 创建readline接口实例
let rline = readline.createInterface({
    input: fRead,
//  output: fWrite,
    terminal: true
});

// 用缩排表现层级关系,假设最多5个层级
const indent1 ="  ";
const indent2 ="    ";
const indent3 ="      ";
const indent4 ="        ";

var txt, title, root, edge, p_node, node1, node2, node3, node4, node5;
// line 事件
let ln =1;
rline.on('line', function(line){
    txt = line.trim();
    if (ln ==1){
        // 读取第一行:书名
        title = txt;
        // 创建主题节点
        root = et.Element("node");
        root.set('id', '1');
        root.set('text', txt);
        // 定义状态:
        state = subElement(root, "state")
        state.set("opened", 'true')
        state.set("disabled", 'true')
    }
    txt = txt.slice(0,-3); // 去掉行尾的页数
    if (txt.length ==0 || ln==1) ;
    else if (txt.length >0 && line.slice(0,1) !=' '){
        // 创建主题的子节点(1级节点)
        node1 = subElement(root, "children");
        node1.set('id', String(ln));
        node1.set('text', txt);
        p_node = node1; // 寄存父节点
    }
    else if (line.startsWith(indent1) && line.slice(2,3) !=' '){
        // 创建node1的子节点(2级节点)
        if (node1) node2 = subElement(node1, "children");
        else node2 = subElement(root, "children");
        node2.set('id', String(ln));
        node2.set('text', txt);
        p_node = node2;
    }
    else if (line.startsWith(indent2) && line.slice(4,5) !=' '){    
        // 创建node2的子节点(3级节点)
        if (node2) node3 = subElement(node2, "children");
        else if(node1) node3 = subElement(node1, "children");
        else node3 = subElement(root, "children");
        node3.set('id', String(ln));
        node3.set('text', txt);
        p_node = node3;
    }
    else if (line.startsWith(indent3) && line.slice(6,7) !=' '){
        // 创建node3的子节点(4级节点)
        if (node3) node4 = subElement(node3, "children");
        else if (node2) node4 = subElement(node2, "children");
        else if (node1) node4 = subElement(node1, "children");
        else node4 = subElement(root, "children");
        node4.set('id', String(ln));
        node4.set('text', txt);
        p_node = node4;
    }
    else if (line.startsWith(indent4) && line.slice(8,9) !=' '){
        // 创建node4的子节点(5级节点)
        if (node4) node5 = subElement(node4, "children");
        else if (p_node) node5 = subElement(p_node, "children");
        else node5 = subElement(root, "children");
        node5.set('id', String(ln));
        node5.set('text', txt);
    }
    else {
        console.log(txt);
    }
    ln++;
});
// 官网 www.npmjs.com/package/xml2js 查找 Options
//  Parser 用于解析xml为json对象 
let parser = new xml2js.Parser({explicitArray:false, mergeAttrs:true});
var etree, xml, json_str;
let filename ="jstree_template.htm";
rline.on('close', function(){
    etree = new ElementTree(root);
    xml = etree.write({'xml_declaration': false});
    parser.parseString(xml, function(err,res){
        if (err) throw err;
        //console.dir(res);
        json_str = '['+ JSON.stringify(res['node'], null,2) +']';
    });
    // 官网 ejs.bootcss.com/#docs  <%- 输出非转义的数据到模板 %>
  //ejs.renderFile(filename, data, options, function(err, str){
    ejs.renderFile(filename, {title:title, mydir:json_str}, {}, function(err, str){
        // str => 输出渲染后的 HTML 字符串
        fWrite.write(str);
    });    
    console.log("line number: "+ln);
});

https://gitee.com/ 搜索 jstree 下载

https://gitee.com/mirrors/jstree?_from=gitee_search

git clone https://gitee.com/mirrors/jstree.git

编写 jstree_template.htm 如下

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=Edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title><%= title%></title>
  <script src="../js/jquery-3.2.1.min.js"></script>
  <link rel="stylesheet" href="../js/jstree/dist/themes/default/style.css" />
  <script src="../js/jstree/dist/jstree.min.js"></script>
</head>
<body>
  <!-- 搜索框 -->
  <div class="search_input">
  <input type="text" id="search_a" />
  <img src="../js/jstree/dist/search.png" />
  </div>
  <div id="treeview1" class="treeview">
  </div>
<script type="text/javascript">
  var mydir = <%- mydir%>;
  $("#treeview1").jstree({
    'core' : {
    "multiple" : false,
    'data' : mydir,
    'dblclick_toggle': true
    },
    "plugins" : ["search"]
  });
  //输入框输入时自动搜索
  var tout = false;
  $('#search_a').keyup(function(){
    if (tout) clearTimeout(tout);    
    tout = setTimeout(function(){
      $('#treeview1').jstree(true).search($('#search_a').val());   
    }, 250);
  });   
</script> 
</body>
</html>

运行 node txt_etree_json.js your_pdf_dir.txt

生成 your_pdf_dir.htm

相关推荐
一缕82年的清风18 小时前
用了 3 年 Notion 和 Obsidian 后,为什么我最终把所有身家搬到了思源笔记?
node.js
Dumbness21 小时前
一份 JSON 生成增删改查接口,入参清洗漏了什么:Number(" ") 是 0,搜 100% 把 1000 元券也搜出来
node.js·express
FungLeo2 天前
成为全栈·基础补充·Node.js 运行时:事件循环与异步
javascript·node.js·事件循环·后端开发·异步编程·成为全栈
用户087308654873 天前
用 GUI 自动化写了一个群聊 AI:5 个真实事故,和 7 条让 AI 不像机器人的设计
node.js
Hello_Pyhx3 天前
NWinfo 导出 Windows 硬件信息:从 JSON 报告到缺项排查
windows·json
程序员大阳4 天前
副队长JavaScript教程(66)-本地存储实战:待办事项网页的开发
javascript·json·实战·待办事项·本地存储·案例
Dumbness4 天前
毕设后台导出 CSV 的 4 个坑:date 字段漏了公式防护,搜索框输入 % 能扫全表
node.js·express
视觉小萌新5 天前
AI Class 3 · Chapter 2-3:函数、异常、文件读写+JSON / JSONL 读写(小白版)
人工智能·python·json
翊众建站5 天前
用 JSON-LD 给企业官网做结构化数据:LocalBusiness 与 FAQPage 实践笔记
人工智能·搜索引擎·json
Patrick_Wilson6 天前
读懂一个 Go JSON 处理函数:从输入数据追踪结构体、校验与错误返回
go·json·编程语言