diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/Markdown/Content.tsx | 5 | ||||
| -rw-r--r-- | src/lib/Markdown/Paragraph.tsx | 67 | 
2 files changed, 70 insertions, 2 deletions
| diff --git a/src/lib/Markdown/Content.tsx b/src/lib/Markdown/Content.tsx index b7829ed..2a9e2ee 100644 --- a/src/lib/Markdown/Content.tsx +++ b/src/lib/Markdown/Content.tsx @@ -1,6 +1,7 @@  import React from 'react';  import CodeBlock from './CodeBlock'; +import Paragraph from './Paragraph';  import { ParserPropTypes } from './types'; @@ -16,10 +17,10 @@ const Content: React.FC<ParserPropTypes> = ({ rawLines }) => {    let result;    if (denotesCodeBlock(line)) {      const closeIndex = rawLines.findIndex(line => denotesCodeBlock(line)); -    const codeBlockLines = rawLines.splice(0, closeIndex); +    const codeBlockLines = rawLines.splice(0, closeIndex + 1).slice(0, closeIndex);      result = <CodeBlock rawLines={codeBlockLines} />    } else { -    result = <p> {line} </p> +    result = <Paragraph data={line} />    }    return ( diff --git a/src/lib/Markdown/Paragraph.tsx b/src/lib/Markdown/Paragraph.tsx new file mode 100644 index 0000000..f433cf5 --- /dev/null +++ b/src/lib/Markdown/Paragraph.tsx @@ -0,0 +1,67 @@ +import React from 'react'; + +interface PropTypes { +  data: string; +} + +interface Closures { +  [key: string]: string; +} + +interface Patterns { +  [key: string]: RegExp; +} + +interface Styles { +  [key: string]: React.CSSProperties; +} + + +const captureInside = (closure: string): any => { +  return new RegExp(closure + '([^' + closure + ']+)' + closure); +} +const capture = (closure: string): any => { +  return new RegExp('(' + closure + '[^' + closure + ']+' + closure + ')'); +} + +const closures: Closures = { +  inlineCode: '`', +  bold: '\\*\\*', +}; + +const styles: Styles = { +  inlineCode: { background: '#444444', padding: '4px' }, +  bold: { fontWeight: 'bold' }, +}; +const patterns: Patterns = {}; + + +Object.keys(closures).forEach((key: string): void => { +  patterns[key] = capture(closures[key]); +}); + +const matcher = new RegExp(Object.values(patterns).map(regex => regex.source).join('|')); + +Object.keys(closures).forEach((key: string): void => { +  patterns[key] = captureInside(closures[key]); +}); + + +const SyntaxSpan: React.FC<PropTypes> = ({ data }) => { +  if (!data) return null; +  for (let key in styles) { +    const match = data.match(patterns[key]); +    if (match) return <span style={styles[key]}>{match[1]}</span>; +  }; +  return <>{data}</>; +} + +const Paragraph: React.FC<PropTypes> = ({ data }) => { +  let result; +  result = data.split(matcher); +  result = result.map(span => <SyntaxSpan data={span} />); +  return <p> {result} </p>; +} + +export default Paragraph; + | 
