diff --git a/browser/lib/markdown.js b/browser/lib/markdown.js index 67a4b530..91a04a2a 100644 --- a/browser/lib/markdown.js +++ b/browser/lib/markdown.js @@ -3,6 +3,7 @@ import emoji from 'markdown-it-emoji' import math from '@rokt33r/markdown-it-math' import _ from 'lodash' +// FIXME We should not depend on global variable. const katex = window.katex function createGutter (str) { @@ -137,37 +138,9 @@ md.renderer.render = function render (tokens, options, env) { let result = originalRender.call(md.renderer, tokens, options, env) return result } +// FIXME We should not depend on global variable. window.md = md -function strip (input) { - var output = input - try { - output = output - .replace(/^([\s\t]*)([\*\-\+]|\d\.)\s+/gm, '$1') - .replace(/\n={2,}/g, '\n') - .replace(/~~/g, '') - .replace(/`{3}.*\n/g, '') - .replace(/<(.*?)>/g, '$1') - .replace(/^[=\-]{2,}\s*$/g, '') - .replace(/\[\^.+?\](: .*?$)?/g, '') - .replace(/\s{0,2}\[.*?\]: .*?$/g, '') - .replace(/!\[.*?\][\[\(].*?[\]\)]/g, '') - .replace(/\[(.*?)\][\[\(].*?[\]\)]/g, '$1') - .replace(/>/g, '') - .replace(/^\s{1,2}\[(.*?)\]: (\S+)( ".*?")?\s*$/g, '') - .replace(/^#{1,6}\s*([^#]*)\s*(#{1,6})?/gm, '$1') - .replace(/([\*_]{1,3})(\S.*?\S)\1/g, '$2') - .replace(/(`{3,})(.*?)\1/gm, '$2') - .replace(/^-{3,}\s*$/g, '') - .replace(/`(.+?)`/g, '$1') - .replace(/\n{2,}/g, '\n\n') - } catch (e) { - console.error(e) - return input - } - return output -} - function normalizeLinkText (linkText) { return md.normalizeLinkText(linkText) } @@ -178,7 +151,7 @@ const markdown = { const renderedContent = md.render(content) return renderedContent }, - strip, normalizeLinkText } + export default markdown diff --git a/browser/lib/markdownTextHelper.js b/browser/lib/markdownTextHelper.js new file mode 100644 index 00000000..1501e2c7 --- /dev/null +++ b/browser/lib/markdownTextHelper.js @@ -0,0 +1,39 @@ +/** + * @fileoverview Text trimmer for markdown note. + */ + +/** + * @param {string} input + * @return {string} + */ +export function strip (input) { + let output = input + try { + output = output + .replace(/^([\s\t]*)([\*\-\+]|\d+\.)\s+/gm, '$1') + .replace(/\n={2,}/g, '\n') + .replace(/~~/g, '') + .replace(/`{3}.*\n/g, '') + .replace(/<(.*?)>/g, '$1') + .replace(/^[=\-]{2,}\s*$/g, '') + .replace(/\[\^.+?\](: .*?$)?/g, '') + .replace(/\s{0,2}\[.*?\]: .*?$/g, '') + .replace(/!\[.*?\][\[\(].*?[\]\)]/g, '') + .replace(/\[(.*?)\][\[\(].*?[\]\)]/g, '$1') + .replace(/>/g, '') + .replace(/^\s{1,2}\[(.*?)\]: (\S+)( ".*?")?\s*$/g, '') + .replace(/^#{1,6}\s*([^#]*)\s*(#{1,6})?/gm, '$1') + .replace(/(`{3,})(.*?)\1/gm, '$2') + .replace(/^-{3,}\s*$/g, '') + .replace(/`(.+?)`/g, '$1') + .replace(/\n{2,}/g, '\n\n') + } catch (e) { + console.error(e) + return input + } + return output +} + +export default { + strip +} diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index 767f17b3..bc407b62 100644 --- a/browser/main/Detail/MarkdownNoteDetail.js +++ b/browser/main/Detail/MarkdownNoteDetail.js @@ -9,7 +9,7 @@ import FolderSelect from './FolderSelect' import dataApi from 'browser/main/lib/dataApi' import { hashHistory } from 'react-router' import ee from 'browser/main/lib/eventEmitter' -import markdown from 'browser/lib/markdown' +import markdown from 'browser/lib/markdownTextHelper' import StatusBar from '../StatusBar' import _ from 'lodash' import { findNoteTitle } from 'browser/lib/findNoteTitle' diff --git a/tests/lib/markdown-text-helper-test.js b/tests/lib/markdown-text-helper-test.js new file mode 100644 index 00000000..e4ad86bc --- /dev/null +++ b/tests/lib/markdown-text-helper-test.js @@ -0,0 +1,46 @@ +/** + * @fileoverview Unit test for browser/lib/markdown + */ +const test = require('ava') +const markdown = require('browser/lib/markdownTextHelper') + +test(t => { + // [input, expected] + const testCases = [ + // List + [' - ', ' '], + [' + ', ' '], + [' * ', ' '], + [' * ', ' '], + [' 1. ', ' '], + [' 2. ', ' '], + [' 10. ', ' '], + ['\t- ', '\t'], + ['- ', ''], + // Header with using line + ['\n==', '\n'], + ['\n===', '\n'], + ['test\n===', 'test\n'], + // Code block + ['```test\n', ''], + ['```test\nhoge', 'hoge'], + // HTML tag + ['<>', ''], + ['', 'test'], + ['hoge', 'hogetest'], + ['moge', 'testmoge'], + // Emphasis + ['~~', ''], + ['~~text~~', 'text'], + // Don't remove underscore + ['`MY_TITLE`', 'MY_TITLE'], + ['MY_TITLE', 'MY_TITLE'], + // I have no idea for it... + ['```test', '`test'] + ] + + testCases.forEach(testCase => { + const [input, expected] = testCase + t.is(markdown.strip(input), expected, `Test for strip() input: ${input} expected: ${expected}`) + }) +})