在 Swift 中用 NSTextView 上的 Markdown 替换子字符串

Replace Substring with Markdown on NSTextView in Swift

Swift 5, Xcode 11

在 Stack Overflow 文本编辑器中,您可以 select 一些文本(如下面的 "selected"),单击 粗体 按钮,它会替换:

Text selected here.

...有了这个:

Text **selected** here.

我正在尝试使用 Swift 5.

NSTextView 完成同样的事情

我可以这样获取文本的selectedRange

@IBAction func clickBold(_ sender: NSButton) {
  let range = content.selectedRange() //content is my NSTextView
}

但我不知道如何从这里开始。我找到 replaceSubrange 但它似乎只接受 Range<String.Index> 而不是 NSRange.

@IBAction func clickBold(_ sender: NSButton) {
  let range = content.selectedRange() //content is my NSTextView
  var markdownText = content.string
  markdownText.replaceSubrange(range, with: "**\(markdownText)**") 
}

有没有人以前做过这个,可以帮我看看我错过了什么?谢谢!

您应该使用 NSTextreplaceCharacters(in:with:) 方法(其子类 NSTextView 是)。

@IBAction func clickBold(_ sender: NSButton) {
  let range = content.selectedRange()
  let selectedText = (content.string as NSString).substring(with: range)
  content.replaceCharacters(in: range, with: "**\(selectedText)**") 
}

看起来这样可行:

let range = content.selectedRange()
markdownText = content.string

if let index = Range(range, in: markdownText){
  content.replaceCharacters(in: range, with: "**\(markdownText[index])**")
}

它提供了我需要将其包装在 ** ** 中的选定文本片段。 @MartinR 的链接 SO post 帮助我看到我可以使用 Range().

转换字符串索引