@@ -5,15 +5,13 @@ import {
55 emojiRegex ,
66 linkWithTextRegex ,
77 mentionRegex ,
8+ placeholders ,
9+ rawBrElement ,
10+ rawNewLineElement ,
811 strikeRegex ,
912} from '@/components/SlackMarkdown/utils/regex'
1013import { objectKeys } from '@toss/utils'
1114
12- const gtltConvertMap = {
13- '>' : '>' ,
14- '<' : '<' ,
15- }
16-
1715const replaceABrAfterTag = ( text : string , tagname : string ) => {
1816 return text . replace (
1917 new RegExp ( `<${ tagname } .*>.*</${ tagname } >(${ rawBrElement } )` , 'g' ) ,
@@ -36,11 +34,6 @@ export const convertMentionString = (text: string) => {
3634 } )
3735}
3836
39- const codeBlockPlaceholder =
40- '_____f1ae2436-495c-4cde-9396-cdca8965b295_CODEBLOCK_f1ae2436-495c-4cde-9396-cdca8965b295____'
41- const rawNewLineElement = String . raw `<div className="h-2" />`
42- const rawBrElement = String . raw `<br />`
43-
4437export const convertNewLineToRawElement = ( text : string ) => {
4538 const convert = ( t : string ) => {
4639 const unifiedNewLineVariants = t . replace ( / \r \n | \r | \n / g, '\n' )
@@ -55,10 +48,10 @@ export const convertNewLineToRawElement = (text: string) => {
5548 return convert ( text )
5649 }
5750
58- const safeCodeBlockText = text . replace ( codeBlockRegex , codeBlockPlaceholder )
51+ const safeCodeBlockText = text . replace ( codeBlockRegex , placeholders . codeBlock )
5952 const convertedText = convert ( safeCodeBlockText )
6053 const result = convertedText . replace (
61- new RegExp ( codeBlockPlaceholder , 'g' ) ,
54+ new RegExp ( placeholders . codeBlock , 'g' ) ,
6255 originCodeBlockText [ 0 ]
6356 )
6457 return result
@@ -80,6 +73,11 @@ export const convertCodeBlockString = (text: string) => {
8073}
8174
8275export const decodeCodeBlockContent = ( text : string ) => {
76+ const gtltConvertMap = {
77+ '>' : '>' ,
78+ '<' : '<' ,
79+ }
80+
8381 const decoded = decodeURIComponent ( text )
8482
8583 return objectKeys ( gtltConvertMap ) . reduce ( ( acc , key ) => {
@@ -138,67 +136,62 @@ export const convertStrikeString = (text: string) => {
138136}
139137
140138export const convertBlockquoteString = ( text : string ) => {
141- const generatePlaceholderRegex = ( k : keyof typeof placeholder ) => {
139+ const generatePlaceholderRegex = ( k : keyof typeof placeholders . blockquote ) => {
142140 const escapeRegex = ( str : string ) => str . replace ( / [ . * + ? ^ $ { } ( ) | [ \] \\ ] / g, '\\$&' )
143- const escapedPlaceholder = escapeRegex ( placeholder [ k ] )
141+ const escapedPlaceholder = escapeRegex ( placeholders . blockquote [ k ] )
144142 const escapedBr = escapeRegex ( rawBrElement )
145143 const escapedDiv = escapeRegex ( rawNewLineElement )
146- const allEscapedPlaceholders = objectKeys ( placeholder )
147- . map ( ( key ) => escapeRegex ( placeholder [ key ] ) )
144+ const allEscapedPlaceholders = objectKeys ( placeholders . blockquote )
145+ . map ( ( key ) => escapeRegex ( placeholders . blockquote [ key ] . trim ( ) ) )
148146 . join ( '|' )
149147
150148 return new RegExp (
151- `(${ escapedPlaceholder } \\s+.*?)(?=${ escapedBr } |${ escapedDiv } |${ allEscapedPlaceholders } |$)` ,
152- 'g '
149+ `(${ escapedPlaceholder . trim ( ) } \\s+.*?)(?=${ escapedBr } |${ escapedDiv } |${ allEscapedPlaceholders } |$)` ,
150+ 'gm '
153151 )
154152 }
155153
156- const placeholder = {
157- 'br-once' :
158- '_____f1ae2436-495c-4cde-9396-cdca8965b295_BLOCKQUOTE-BR-ONCE_f1ae2436-495c-4cde-9396-cdca8965b295____' ,
159- 'br-twice' :
160- '_____f1ae2436-495c-4cde-9396-cdca8965b295_BLOCKQUOTE-BR-TWICE_f1ae2436-495c-4cde-9396-cdca8965b295____' ,
161- 'div-once' :
162- '_____f1ae2436-495c-4cde-9396-cdca8965b295_BLOCKQUOTE-DIV-ONCE_f1ae2436-495c-4cde-9396-cdca8965b295____' ,
163- 'div-twice' :
164- '_____f1ae2436-495c-4cde-9396-cdca8965b295_BLOCKQUOTE-DIV-TWICE_f1ae2436-495c-4cde-9396-cdca8965b295____' ,
165- once : '_____f1ae2436-495c-4cde-9396-cdca8965b295_BLOCKQUOTE-ONCE_f1ae2436-495c-4cde-9396-cdca8965b295____' ,
166- twice :
167- '_____f1ae2436-495c-4cde-9396-cdca8965b295_BLOCKQUOTE-TWICE_f1ae2436-495c-4cde-9396-cdca8965b295____' ,
168- }
169-
170154 // 반드시 replace하는 순서 고정
171155 const preConvertedText = text
172- . replaceAll ( `${ rawBrElement } >>` , placeholder [ 'br-twice' ] )
173- . replaceAll ( `${ rawNewLineElement } >>` , placeholder [ 'div-twice' ] )
174- . replaceAll ( `${ rawBrElement } >` , placeholder [ 'br-once' ] )
175- . replaceAll ( `${ rawNewLineElement } >` , placeholder [ 'div-once' ] )
176- . replace ( / ^ & g t ; & g t ; / m, placeholder [ 'twice' ] )
177- . replace ( / ^ & g t ; / m, placeholder [ 'once' ] )
156+ . replaceAll (
157+ new RegExp ( `${ rawBrElement } (>|>)(>|>) ` , 'gm' ) ,
158+ placeholders . blockquote [ 'br-twice' ]
159+ )
160+ . replaceAll (
161+ new RegExp ( `${ rawNewLineElement } (>|>)(>|>) ` , 'gm' ) ,
162+ placeholders . blockquote [ 'div-twice' ]
163+ )
164+ . replaceAll ( new RegExp ( `${ rawBrElement } (>|>) ` , 'gm' ) , placeholders . blockquote [ 'br-once' ] )
165+ . replaceAll (
166+ new RegExp ( `${ rawNewLineElement } (>|>) ` , 'gm' ) ,
167+ placeholders . blockquote [ 'div-once' ]
168+ )
169+ . replace ( / ^ ( & g t ; | > ) ( & g t ; | > ) / m, placeholders . blockquote [ 'twice' ] )
170+ . replace ( / ^ ( & g t ; | > ) / m, placeholders . blockquote [ 'once' ] )
178171
179172 const blockquoted = preConvertedText
180173 . replace ( generatePlaceholderRegex ( 'br-twice' ) , ( match ) => {
181- const content = match . replaceAll ( placeholder [ 'br-twice' ] , '' )
174+ const content = match . replace ( placeholders . blockquote [ 'br-twice' ] , '' )
182175 return `${ rawBrElement } <blockquote data-type="twice">${ content } </blockquote>`
183176 } )
184177 . replace ( generatePlaceholderRegex ( 'div-twice' ) , ( match ) => {
185- const content = match . replaceAll ( placeholder [ 'div-twice' ] , '' )
178+ const content = match . replaceAll ( placeholders . blockquote [ 'div-twice' ] , '' )
186179 return `${ rawNewLineElement } <blockquote data-type="twice">${ content } </blockquote>`
187180 } )
188181 . replace ( generatePlaceholderRegex ( 'br-once' ) , ( match ) => {
189- const content = match . replaceAll ( placeholder [ 'br-once' ] , '' )
182+ const content = match . replaceAll ( placeholders . blockquote [ 'br-once' ] , '' )
190183 return `${ rawBrElement } <blockquote data-type="once">${ content } </blockquote>`
191184 } )
192185 . replace ( generatePlaceholderRegex ( 'div-once' ) , ( match ) => {
193- const content = match . replaceAll ( placeholder [ 'div-once' ] , '' )
186+ const content = match . replaceAll ( placeholders . blockquote [ 'div-once' ] , '' )
194187 return `${ rawNewLineElement } <blockquote data-type="once">${ content } </blockquote>`
195188 } )
196189 . replace ( generatePlaceholderRegex ( 'once' ) , ( match ) => {
197- const content = match . replaceAll ( placeholder [ 'once' ] , '' )
190+ const content = match . replaceAll ( placeholders . blockquote [ 'once' ] , '' )
198191 return `<blockquote data-type="once">${ content } </blockquote>`
199192 } )
200193 . replace ( generatePlaceholderRegex ( 'twice' ) , ( match ) => {
201- const content = match . replaceAll ( placeholder [ 'twice' ] , '' )
194+ const content = match . replaceAll ( placeholders . blockquote [ 'twice' ] , '' )
202195 return `<blockquote data-type="twice">${ content } </blockquote>`
203196 } )
204197 . replace (
0 commit comments