@@ -3,9 +3,11 @@ const ESC_ANSI_CSI_PATTERN = "\\x1b\\[[\\x20-\\x3f]*[\\x40-\\x7e]";
33const C1_ANSI_CSI_PATTERN = "\\x9b[\\x20-\\x3f]*[\\x40-\\x7e]" ;
44const PARAMETERIZED_C1_ANSI_CSI_PATTERN = "\\x9b[\\x20-\\x3f]+[\\x40-\\x7e]" ;
55const ANSI_CSI_PATTERN = `(?:${ ESC_ANSI_CSI_PATTERN } |${ C1_ANSI_CSI_PATTERN } )` ;
6- // OSC: ESC ] <payload> ST. Covers OSC-8 hyperlinks and clipboard/title escapes.
6+ // OSC: ESC ] or C1 OSC, then <payload> ST. Covers hyperlinks and clipboard/title escapes.
77// ST can be ESC \, BEL, or its C1 form.
8- const ANSI_OSC_PATTERN = "(?:\\x1b\\]|\\x9d)[^\\x07\\x1b\\x9c]*(?:\\x1b\\\\|\\x07|\\x9c)" ;
8+ const ANSI_OSC_INTRODUCER_PATTERN = "(?:\\x1b\\]|\\x9d)" ;
9+ const ANSI_STRING_TERMINATOR_PATTERN = "(?:\\x1b\\\\|\\x07|\\x9c)" ;
10+ const ANSI_OSC_PATTERN = `${ ANSI_OSC_INTRODUCER_PATTERN } [^\\x07\\x1b\\x9c]*${ ANSI_STRING_TERMINATOR_PATTERN } ` ;
911
1012const ANSI_CSI_REGEX = new RegExp ( ANSI_CSI_PATTERN , "g" ) ;
1113const ANSI_OSC_REGEX = new RegExp ( ANSI_OSC_PATTERN , "g" ) ;
@@ -40,8 +42,7 @@ const SANITIZATION_ANSI_SEQUENCE_REGEX = new RegExp(
4042 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
4143 * SOFTWARE.
4244 */
43- const ANSI_STRING_TERMINATOR_PATTERN = "(?:\\u0007|\\u001B\\u005C|\\u009C)" ;
44- const ANSI_OSC_SEQUENCE_PATTERN = `(?:\\u001B\\][\\s\\S]*?${ ANSI_STRING_TERMINATOR_PATTERN } )` ;
45+ const ANSI_OSC_SEQUENCE_PATTERN = `${ ANSI_OSC_INTRODUCER_PATTERN } [\\s\\S]*?${ ANSI_STRING_TERMINATOR_PATTERN } ` ;
4546const ANSI_CONTROL_SEQUENCE_PATTERN =
4647 "[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]" ;
4748const ANSI_COMPAT_SEQUENCE_REGEX = new RegExp (
@@ -66,7 +67,9 @@ export function stripAnsiSequences(input: string): string {
6667 if ( typeof input !== "string" ) {
6768 throw new TypeError ( `Expected a \`string\`, got \`${ typeof input } \`` ) ;
6869 }
69- if ( ! input . includes ( "\u001B" ) && ! input . includes ( "\u009B" ) ) {
70+ // C1 OSC is independent of C1 CSI, so both 8-bit introducers must
71+ // participate in the fast path.
72+ if ( ! input . includes ( "\u001B" ) && ! input . includes ( "\u009B" ) && ! input . includes ( "\u009D" ) ) {
7073 return input ;
7174 }
7275 return input . replace ( ANSI_COMPAT_SEQUENCE_REGEX , "" ) ;
@@ -163,8 +166,7 @@ function isWideEmojiGrapheme(grapheme: string): boolean {
163166 }
164167 // Minimally qualified ZWJ sequences still shape as one wide emoji in terminals.
165168 return (
166- grapheme . includes ( "\u200D" ) &&
167- ( grapheme . match ( extendedPictographicPattern ) ?. length ?? 0 ) >= 2
169+ grapheme . includes ( "\u200D" ) && ( grapheme . match ( extendedPictographicPattern ) ?. length ?? 0 ) >= 2
168170 ) ;
169171}
170172
0 commit comments