@@ -614,44 +614,68 @@ function multilineStyle(textarea: HTMLTextAreaElement, arg: StyleArgs) {
614614 return { text, selectionStart, selectionEnd}
615615}
616616
617- function undoOrderedListStyle ( textarea : HTMLTextAreaElement ) : string [ ] {
618- const text = textarea . value . slice ( textarea . selectionStart , textarea . selectionEnd )
617+ interface UndoResult {
618+ text : string
619+ processed : boolean
620+ }
621+ function undoOrderedListStyle ( text : string ) : UndoResult {
619622 const lines = text . split ( '\n' )
620623 const orderedListRegex = / ^ \d + \. \s + /
621- const result = lines
622624 const shouldUndoOrderedList = lines . every ( line => orderedListRegex . test ( line ) )
625+ let result = lines
623626 if ( shouldUndoOrderedList ) {
624- return lines . map ( line => line . replace ( orderedListRegex , '' ) )
627+ result = lines . map ( line => line . replace ( orderedListRegex , '' ) )
628+ }
629+
630+ return {
631+ text : result . join ( '\n' ) ,
632+ processed : shouldUndoOrderedList
625633 }
626- return result
627634}
628635
629- function undoUnorderedListStyle ( textarea : HTMLTextAreaElement ) : string [ ] {
630- const text = textarea . value . slice ( textarea . selectionStart , textarea . selectionEnd )
636+ function undoUnorderedListStyle ( text : string ) : UndoResult {
631637 const lines = text . split ( '\n' )
632638 const unorderedListPrefix = '- '
633639 const shouldUndoUnorderedList = lines . every ( line => line . startsWith ( unorderedListPrefix ) )
634- const result = lines
640+ let result = lines
635641 if ( shouldUndoUnorderedList ) {
636- return lines . map ( line => line . slice ( unorderedListPrefix . length , line . length ) )
642+ result = lines . map ( line => line . slice ( unorderedListPrefix . length , line . length ) )
643+ }
644+
645+ return {
646+ text : result . join ( '\n' ) ,
647+ processed : shouldUndoUnorderedList
637648 }
638- return result
639649}
640650
641651function listStyle ( textarea : HTMLTextAreaElement , style : StyleArgs ) : SelectionRange {
642652 const noInitialSelection = textarea . selectionStart === textarea . selectionEnd
643653 let selectionStart = textarea . selectionStart
644654 let selectionEnd = textarea . selectionEnd
645655
646- undoOrderedListStyle ( textarea )
647- undoUnorderedListStyle ( textarea )
656+ // Select whole line
657+ expandSelectionToLine ( textarea )
648658
649659 const prefix = '- '
650660
651- // Select whole line
652- expandSelectionToLine ( textarea )
661+ let selectedText = textarea . value . slice ( textarea . selectionStart , textarea . selectionEnd )
662+
663+ const undoOrderedListResult = undoOrderedListStyle ( selectedText )
664+ const undoUnorderedListResult = undoUnorderedListStyle ( undoOrderedListResult . text )
665+
666+ if ( undoOrderedListResult . processed || undoUnorderedListResult . processed ) {
667+ if ( noInitialSelection ) {
668+ selectionStart = Math . max ( selectionStart - prefix . length , 0 )
669+ selectionEnd = selectionStart
670+ } else {
671+ selectionStart = Math . max ( selectionStart - prefix . length , 0 )
672+ selectionEnd = selectionEnd + prefix . length // * lines.length
673+ }
674+ return { text : undoUnorderedListResult . text , selectionStart, selectionEnd}
675+ }
676+
677+ selectedText = undoUnorderedListResult . text
653678
654- const selectedText = textarea . value . slice ( textarea . selectionStart , textarea . selectionEnd )
655679 const lines = selectedText . split ( '\n' ) . map ( ( value , index ) => {
656680 return `${ prefix } ${ value } `
657681 } )
@@ -667,7 +691,6 @@ function listStyle(textarea: HTMLTextAreaElement, style: StyleArgs): SelectionRa
667691 }
668692
669693 const text = newlinesToAppend + lines . join ( '\n' ) + newlinesToPrepend
670-
671694 return { text, selectionStart, selectionEnd}
672695}
673696
0 commit comments