From fdf0eab97e98a15fde92f5c06c3e6b23cc4ae6da Mon Sep 17 00:00:00 2001 From: Jocs Date: Mon, 12 Feb 2018 00:05:41 +0800 Subject: [PATCH] feat: add util, transform tokens to markdown text --- src/editor/parser/StateRender.js | 5 ++-- src/editor/parser/parse.js | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/editor/parser/StateRender.js b/src/editor/parser/StateRender.js index 7993297e..64d37aaa 100644 --- a/src/editor/parser/StateRender.js +++ b/src/editor/parser/StateRender.js @@ -1,7 +1,7 @@ import { LOWERCASE_TAGS, CLASS_OR_ID } from '../config' import { conflict, isLengthEven, isEven, getIdWithoutSet, loadImage, getImageSrc } from '../utils' import { insertAfter, operateClassName } from '../utils/domManipulate.js' -import { tokenizer } from './parse' +import { tokenizer, generator } from './parse' import { validEmoji } from '../emojis' const snabbdom = require('snabbdom') @@ -115,7 +115,8 @@ class StateRender { return h(blockSelector, data, block.children.map(child => renderBlock(child))) } else { - console.log(tokenizer(block.text)) + const tokens = tokenizer(block.text) + console.log(generator(tokens)) let children = block.text ? tokenizer(block.text).reduce((acc, token) => { const chunk = this[token.type](h, cursor, block, token) diff --git a/src/editor/parser/parse.js b/src/editor/parser/parse.js index eedbb239..763b7d4e 100644 --- a/src/editor/parser/parse.js +++ b/src/editor/parser/parse.js @@ -182,6 +182,45 @@ export const tokenizer = src => { return tokenizerFac(src, beginRules, inlineRules, 0) } +// transform `tokens` to text +export const generator = tokens => { + let result = '' + for (const token of tokens) { + switch (token.type) { + case 'hr': + case 'header': + case 'code_fense': + case 'backlash': + result += token.marker + token.content + break + case 'text': + result += token.content + break + case 'em': + case 'del': + case 'strong': + result += `${token.marker}${generator(token.children)}${token.backlash}${token.marker}` + break + case 'emoji': + case 'inline_code': + result += `${token.marker}${token.content}${token.backlash}${token.marker}` + break + case 'link': + result += `[${generator(token.children)}${token.backlash.first}](${token.href}${token.backlash.second})` + break + case 'image': + result += `![${generator(token.children)}${token.backlash.first}](${token.src}${token.backlash.second})` + break + case 'auto_link': + result += token.href + break + default: + throw new Error(`unhandle token type: ${token.type}`) + } + } + return result +} + /** * [{ * type: 'hr',