【问题标题】:convert markdown to json object将 markdown 转换为 json 对象
【发布时间】:2017-07-31 17:22:17
【问题描述】:

我有一个 Markdown 文件通过 webpack 加载器导入到这样的节点模块中

import mardownFile from './markdownfile.md'

此文件是一本教科书,其章节由## / h2 标签分隔

现在,我正在寻找一种将其转换为 json 对象的方法,其中每个 h2 标记(或其他可能的包装器)位于单独的章节块中,以与页面内容为 props.children 的反应页面组件一起使用。有关我正在尝试解决的问题的更多详细信息

我的 markdown.md 文件中有这个

#Title
##Chapter 1
text text
text
##Chapter 2
text
etc
##Chapter 3
more text
image

我想阅读这个降价并将它转换成一个对象,像这样......

var aText = {
pages: [
{
 "title": "Chapter 1.",
 "text": "text",
},
{
"title": "Chapter 2.",
"text": "text",
},
{
"title": "Chapter 3.",
"text": "text",
"img": "cat-stevens.png",
}
]}

然后在一个 javascript react 组件中渲染一个像这样的页面组件

<Page page={aText.pages[0]} />

我在 mac osx 计算机上,但这是个人网络客户端项目,我试图在标准浏览器中解析它,我正在使用 Chrome,完成此任务的最佳方法是什么,有什么建议吗?

【问题讨论】:

  • 您能给我们举个例子吗?我不确定你想完成什么。
  • 您使用的是 linux、mac 还是 windows?我可以根据您的情况更详细地更新我的答案。

标签: javascript json node.js converter markdown


【解决方案1】:

您不能导入 md 文件,因为导入仅适用于 javascript 文件。 您需要使用一些降价解析器或编写自己的。例如markdown-it:

var MarkdownIt = require('markdown-it');
var md = new MarkdownIt();
var result = md.parse('# markdown-it rulezz!');
console.log(result);

你会得到:

[Token {
  type: 'heading_open',
  tag: 'h1',
  attrs: null,
  map: [0, 1],
  nesting: 1,
  level: 0,
  children: null,
  content: '',
  markup: '#',
  info: '',
  meta: null,
  block: true,
  hidden: false
},
  Token {
  type: 'inline',
  tag: '',
  attrs: null,
  map: [0, 1],
  nesting: 0,
  level: 1,
  children: [[Object]],
  content: 'markdown-it rulezz!',
  markup: '',
  info: '',
  meta: null,
  block: true,
  hidden: false
},
  Token {
  type: 'heading_close',
  tag: 'h1',
  attrs: null,
  map: null,
  nesting: -1,
  level: 0,
  children: null,
  content: '',
  markup: '#',
  info: '',
  meta: null,
  block: true,
  hidden: false
}]

【讨论】:

  • 谢谢,这可以作为基础,由此我可以遍历结果,寻找章节以将它们推入单独的对象中。
  • 这是正确答案。任何输出列表或标记(或任何其他低级日期结构)的 Markdown 解析器都可以工作。
  • @galkin markdown-看起来很有趣,但是,我不知道 markdown-它是否可以从标记化格式重新组装 Markdown。看来他们的Renderer 只能使用标记化的 Markdown 并返回 HTML。你对 Markdown 的全部功能了解更多吗?他们的文档没有明确说明 markdown-it 能够做什么,或者我错过了那部分。
【解决方案2】:

试试markdown-to-json library

npm install -g markdown-to-json

给定一个名为 lottery.md 的文件,我转到终端中的目录并输入:

m2j lottery.md

这会在屏幕上输出 json。

如果您使用的是bash based terminal,您可以将该输出通过管道传输到这样的文件中。

m2j lottery.md >> lottery.json

这将在与您的降价相同的文件夹中创建一个名为 lottery.json 的 json 文件。

如需更多帮助,您可以使用:

m2j -h

【讨论】:

  • 我正在寻找一个 web 客户端,这个 cli 版本的基于反应的解决方案
【解决方案3】:

对于我的第一次搜索,我发现jsonmark 包有点像您所要求的,但它创建了一个具有顺序和内容的对象,这是不必要的,并且很难修改其代码,因为它基于正则表达式。

我同意 galkin 的回答,即使用降价解析器的标记应该可以得到你想要的。

这里是我如何基于 Markdown 创建 json 对象的示例。我的目标是拥有一个 json 数组,其中包含具有头部和主体的元素,头部是 h1,而主体是它下面的所有内容。在示例中,我使用marked 作为降价解析器。 (我在 nodejs 上运行它,因为从文件中读取文件不太可能。)

var fs = require('fs');
var marked = require('./marked.min.js');
var finally = [];
var heading = '';
var lexbody = [];

var loadmd = function(file){
  var markdown = fs.readFileSync(file, 'utf8');
  jsonraw = marked.lexer(markdown);
  finally = [];
  heading = '';
  lexbody = [];
  jsonraw.forEach(getThem);
  return finally;
}
var getThem = function(item, index){
  if (item.type == "heading" && item.depth == 1){
    if (heading == ''){
      heading = item.text;
    } else {
      lexbody['links']=jsonraw.links;
      finally.push(
        {
          "heading": heading,
          "body": marked.parser(lexbody)
        }
      );
      heading = item.text;
      lexbody = [];
    }
  } else {
    lexbody.push(item);
  }
  // don't leave out the last element
  if (index == jsonraw.length-1){
    lexbody['links']=jsonraw.links;
    finally.push(
      {
        "heading": heading,
        "body": marked.parser(lexbody)
      }
    );
  }
}

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 2021-05-17
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多