データベースに保存されたテキストを表示しています。データはfirebaseから文字列として取得されます(改行が含まれています)。HTMLとして表示するには、もともと次のことを行いました。
<p className="term-definition"
dangerouslySetInnerHTML={{__html: (definition.definition) ? definition.definition.replace(/(?:\r\n|\r|\n)/g, '<br />') : ''}}></p>
これはうまくいきました。ただし、追加機能が 1 つあります。ユーザーが入力[word]
すると、その単語がリンクされます。これを達成するために、次の関数を作成しました。
parseDefinitionText(text){
text = text.replace(/(?:\r\n|\r|\n)/g, '<br />');
text = text.replace(/\[([A-Za-z0-9'\-\s]+)\]/, function(match, word){
// Convert it to a permalink
return (<Link to={'/terms/' + this.permalink(word) + '/1'}>{word}</Link>);
}.bind(this));
return text;
},
方法はthis.permalink
関係ないので割愛します。<Link>
ご覧のとおり、react-router からインポートされたコンポーネントを返そうとしていますが、生の HTML であるため、dangerouslySetInnerHTML
適切に動作しなくなりました。
だから私はこの時点でちょっと立ち往生しています。内部テキストの書式設定とリンクの作成の両方を行うにはどうすればよいですか?