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',