From c9d6e1a84a933873c1057459fc13750c80df83c5 Mon Sep 17 00:00:00 2001 From: jbenjaminkr Date: Sat, 6 May 2023 18:16:40 -0400 Subject: [PATCH] Add option to preserve whitespace --- src/Terminal.jsx | 1 + src/TerminalMessage.jsx | 6 +++++- src/defs/types/Terminal.js | 3 ++- src/defs/types/TerminalMessage.js | 3 ++- src/utils/preserveSpaces.js | 7 +++++++ 5 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 src/utils/preserveSpaces.js diff --git a/src/Terminal.jsx b/src/Terminal.jsx index 49bbe720..32bfaf87 100644 --- a/src/Terminal.jsx +++ b/src/Terminal.jsx @@ -119,6 +119,7 @@ export default class Terminal extends Component { dangerMode={this.props.dangerMode} className={!line.isEcho ? this.props.messageClassName : /* istanbul ignore next: Covered by interactivity tests */ undefined} style={!line.isEcho ? this.props.messageStyle : /* istanbul ignore next: Covered by interactivity tests */ undefined} + preserveSpacing={this.props.preserveSpacing} /> }) } diff --git a/src/TerminalMessage.jsx b/src/TerminalMessage.jsx index cb0223a4..b4982238 100644 --- a/src/TerminalMessage.jsx +++ b/src/TerminalMessage.jsx @@ -5,16 +5,20 @@ import defaults from 'defaults' import types from './defs/types/TerminalMessage' import sourceStyles from './defs/styles/TerminalMessage' +import preserveSpaces from './utils/preserveSpaces' + export default class TerminalMessage extends Component { static propTypes = types render () { - const { content, style, className } = this.props + const { content, style, className, preserveSpacing } = this.props const styles = { message: defaults(style, sourceStyles) } + content = preserveSpacing ? preserveSpaces(content) : content + return this.props.dangerMode && typeof content === 'string' ?
:
{content}
diff --git a/src/defs/types/Terminal.js b/src/defs/types/Terminal.js index 3747a182..44729235 100644 --- a/src/defs/types/Terminal.js +++ b/src/defs/types/Terminal.js @@ -39,7 +39,8 @@ const optionTypes = { noEchoBack: PropTypes.bool, noHistory: PropTypes.bool, noAutoScroll: PropTypes.bool, - noNewlineParsing: PropTypes.bool + noNewlineParsing: PropTypes.bool, + preserveSpacing: PropTypes.bool } const labelTypes = { diff --git a/src/defs/types/TerminalMessage.js b/src/defs/types/TerminalMessage.js index be7c1b29..38fb8fd6 100644 --- a/src/defs/types/TerminalMessage.js +++ b/src/defs/types/TerminalMessage.js @@ -4,5 +4,6 @@ export default { content: PropTypes.node, style: PropTypes.object, className: PropTypes.string, - dangerMode: PropTypes.bool + dangerMode: PropTypes.bool, + preserveSpacing: PropTypes.bool } diff --git a/src/utils/preserveSpaces.js b/src/utils/preserveSpaces.js new file mode 100644 index 00000000..5713938a --- /dev/null +++ b/src/utils/preserveSpaces.js @@ -0,0 +1,7 @@ +/** + * Returns a string where spacing is honored by html. + * @param {string} stringOutput + */ +export default function renderSpaces(stringOutput) { + return stringOutput.replace(/ /g, '\u00A0'); +}