CDMarkdownKit 2.5.1

CDMarkdownKit 2.5.1

测试已测试
语言语言 SwiftSwift
许可协议 MIT
发布最后发布2022年12月
SPM支持 SPM

Christopher de Haan 维护。



  • GitHub 仓库
  • 在 CocoaPods.org 页面上

CDMarkdownKit

Star CDMarkdownKit On Github Stack Overflow

CI Status GitHub Release Swift Versions Platforms CocoaPods Compatible Carthage compatible Swift Package Manager Compatible License


概览

变更日志


功能

  • Markdown 解析
    • 斜体
    • 粗体
    • 标题
    • 引用
    • 列表
    • 代码
    • 语法
    • 链接
    • 图片
  • 带有 Markdown 格式的 UITextView
  • 带有 Markdown 格式的 UILabel
  • 平台支持
    • iOS
    • macOS
    • tvOS
    • watchOS
  • 文档

要求

  • iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
  • Swift 5.3+

安装

CocoaPods

CocoaPods 是 Cocoa 项目的依赖管理器。有关使用和安装说明,请访问他们的网站。要将 CDMarkdownKit 集成到您的 Xcode 项目中,请使用 CocoaPods,并在您的 Podfile 中指定它。

pod 'CDMarkdownKit', '2.5.1'

Carthage

Carthage 是一个去中心化的依赖管理器,它会构建您的依赖并提供二进制框架。要将 CDMarkdownKit 集成到您的 Xcode 项目中,请使用 Carthage,并在您的 Cartfile 中指定它。

github "chrisdhaan/CDMarkdownKit" == 2.5.1

Swift Package Manager

Swift Package Manager 是一个用于自动分发 Swift 代码的工具,它集成到 swift 编译器中。

一旦您已设置好 Swift 包,将 CDMarkdownKit 作为依赖项添加就像将它添加到您的 Package.swiftdependencies 值一样简单。

dependencies: [
    .package(url: "https://github.com/chrisdhaan/CDMarkdownKit.git", .upToNextMajor(from: "2.5.1"))
]

Git Submodule

如果您不愿使用上述任何依赖管理器,您可以将 CDMarkdownKit 手动集成到项目中。

  • 在终端中,cd 到您的顶级项目目录,然后运行以下命令(如果您的项目未初始化为 git 仓库)
$ git init
  • 通过运行以下命令将 CDMarkdownKit 添加为 git 子模块
git submodule add https://github.com/chrisdhaan/CDMarkdownKit.git
  • 打开新的 CDMarkdownKit 文件夹,并将 CDMarkdownKit.xcodeproj 拖动到应用程序 Xcode 项目的 Project Navigator 中。

    它应该出现在您应用程序蓝色项目图标下面。它是否位于所有其他 Xcode 组的上方或下方无关紧要。

  • 在 Project Navigator 中选择 CDMarkdownKit.xcodeproj 并验证部署目标是否与您的应用程序目标相匹配。

  • 接下来,在项目导航器(蓝色项目图标)中选择您的应用程序项目,以导航到目标配置窗口,并在侧边栏的“目标”部分中选择应用程序目标。

  • 在那个窗口的标签栏上,打开“常规”面板。

  • 在“二进制文件”部分下点击 + 按钮。

  • 您将看到两个不同的 CDMarkdownKit.xcodeproj 文件夹,每个文件夹都有两个不同的 CDMarkdownKit.framework 版本嵌入在“Products”文件夹中。

    您可以选择哪个“Products”文件夹无关紧要,但选择顶层或底层的 CDMarkdownKit.framework 是很重要的。

  • 选择顶层的 CDMarkdownKit.framework 用于 iOS,底层的用于 macOS。

    您可以通过检查项目的构建日志来验证您选择的版本。针对 CDMarkdownKit 的构建目标将被列为 CDMarkdownKit iOSCDMarkdownKit macOSCDMarkdownKit tvOSCDMarkdownKit watchOS

  • 就是这些!

    CDMarkdownKit.framework 会自动添加为目标依赖项、链接框架和嵌入式框架,在复制文件构建阶段即可完成所有步骤,这样就可以在模拟器和设备上构建了。


贡献

在向 CDMarkdownKit 贡献之前,请阅读我们贡献指南中详细说明的说明。


使用方式

初始化

// Create parser
let markdownParser = CDMarkdownParser()
// Parse markdown
let markdown = "This *framework* helps **with** parsing `markdown`."
label.attributedText = markdownParser.parse(markdown)

自定义

// Create parser
let markdownParser = CDMarkdownParser(font: UIFont(name: "HelveticaNeue", size: 16),
                                      boldFont: UIFont(name: "HelveticaNeue-Bold", size: 16),
                                      italicFont: UIFont(name: "HelveticaNeue-Thin", size: 16),
                                      fontColor: UIColor.darkGray,
                                      backgroundColor: UIColor.lightGray,
                                      squashNewlines: false)
// Customize elements
/// Bold
markdownParser.bold.color = UIColor.cyan
markdownParser.bold.backgroundColor = UIColor.purple
markdownParser.bold.underlineColor = UIColor.red
markdownParser.bold.underlineStyle = .double
/// Header
markdownParser.header.color = UIColor.black
markdownParser.header.backgroundColor = UIColor.orange
/// List
markdownParser.list.color = UIColor.black
markdownParser.list.backgroundColor = UIColor.red
/// Quote
markdownParser.quote.color = UIColor.gray
markdownParser.quote.backgroundColor = UIColor.clear
/// Link
markdownParser.link.color = UIColor.blue
markdownParser.link.backgroundColor = UIColor.green
let linkParagraphStyle = NSMutableParagraphStyle()
linkParagraphStyle.paragraphSpacing = 20
linkParagraphStyle.paragraphSpacingBefore = 0
linkParagraphStyle.lineSpacing = 20.38
markdownParser.link.paragraphStyle = linkParagraphStyle
markdownParser.automaticLink.color = UIColor.blue
markdownParser.automaticLink.backgroundColor = UIColor.green
/// Italic
markdownParser.italic.color = UIColor.gray
markdownParser.italic.backgroundColor = UIColor.clear
/// Code
markdownParser.code.font = UIFont.systemFont(ofSize: 17)
markdownParser.code.color = UIColor.red
markdownParser.code.backgroundColor = UIColor.black
/// Syntax
markdownParser.syntax.font = UIFont.systemFont(ofSize: 15)
markdownParser.syntax.color = UIColor.lightGray
markdownParser.syntax.backgroundColor = UIColor.black
/// Image
markdownParser.image.size = CGSize(width: 100,
                                   height: 50)
/// Strikethrough
markdownParser.strikethrough.font = UIFont.systemFont(ofSize: 20)
markdownParser.strikethrough.color = UIColor.magenta
markdownParser.strikethrough.strikethroughColor = UIColor.darkGray
markdownParser.strikethrough.strikethroughStyle = .double
// Parse markdown
let markdown = "This *framework* helps **with** parsing `markdown`."
label.attributedText = markdownParser.parse(markdown)

支持的 Markdown 元素

*italic* or _italic_
**bold** or __bold__

# Header 1
## Header 2
### Header 3
#### Header 4
##### Header 5
###### Header 6

> Quote

* List
- List
+ List

`code`

```syntax```

[Link](url)
![Image](url)

CDMarkdownTextView

建议以程序方式初始化任何CDMarkdownTextView对象,因为它使用自定义文本绘制对象来渲染属性字符串。

即使是通过故事板初始化,CDMarkdownTextView对象仍然可以渲染,但以下属性的默认行为将被覆盖

  • isScrollEnabled = true
  • isSelectable = false
  • isEditable = false

这些默认值设置为防止崩溃。但仍可能在通过故事板初始化CDMarkdownTextView对象时出现意外的崩溃。

程序示例

let rect = CGRect(x: 20,
                  y: 10,
                  width: CGFloat(self.frame.size.width - 40),
                  height: CGFloat(self.frame.size.height - 30))
/// Create custom text container
let textContainer = NSTextContainer(size: rect.size)
/// Create custom layout manager
let layoutManager = CDMarkdownLayoutManager()
layoutManager.addTextContainer(textContainer)
/// Initialization
let textView = CDMarkdownTextView(frame: rect, 
                                  textContainer: textContainer, 
                                  layoutManager: layoutManager)
textView.translatesAutoresizingMaskIntoConstraints = false
/// Standard markdown UI formatting
textView.roundCodeCorners = true
textView.roundSyntaxCorners = true
/// Custom markdown UI formatting
textView.roundAllCorners = true
/// Add constraints so intrinsic content size is set correctly
let topConstraint = NSLayoutConstraint(item: textView,
                                       attribute: NSLayoutAttribute.top,
                                       relatedBy: NSLayoutRelation.equal,
                                       toItem: textView.superview,
                                       attribute: NSLayoutAttribute.bottom,
                                       multiplier: 1,
                                       constant: 10)
let leadingConstraint = NSLayoutConstraint(item: textView,
                                           attribute: NSLayoutAttribute.leading,
                                           relatedBy: NSLayoutRelation.equal,
                                           toItem: textView.superview,
                                           attribute: NSLayoutAttribute.leadingMargin,
                                           multiplier: 1,
                                           constant: 0)
let trailingConstraint = NSLayoutConstraint(item: textView,
                                            attribute: NSLayoutAttribute.trailing,
                                            relatedBy: NSLayoutRelation.equal,
                                            toItem: textView.superview,
                                            attribute: NSLayoutAttribute.trailingMargin,
                                            multiplier: 1,
                                            constant: 0)
let bottomConstraint = NSLayoutConstraint(item: self.bottomLayoutGuide,
                                          attribute: NSLayoutAttribute.top,
                                          relatedBy: NSLayoutRelation.equal,
                                          toItem: textView,
                                          attribute: NSLayoutAttribute.bottom,
                                          multiplier: 1,
                                          constant: 20)
self.view.addConstraints([topConstraint,
                          leadingConstraint,
                          trailingConstraint,
                          bottomConstraint])
/// Add to view hierarchy
self.view.addSubview(textView)

故事板示例

/// Initialization
@IBOutlet fileprivate weak var textView: CDMarkdownTextView!
/// Standard markdown UI formatting
self.textView.roundCodeCorners = true
self.textView.roundSyntaxCorners = true
/// Custom markdown UI formatting
self.textView.roundAllCorners = true

CDMarkdownLabel

程序示例

let size = self.frame.size
let rect = CGRect(x: 10, 
                  y: 10,
                  width: CGFloat(size.width - 20),
                  height: CGFloat(size.height - 20))
/// Initialization
let label = CDMarkdownLabel(frame: rect)
label.autoresizingMask = [.flexibleWidth, .flexibleHeight]
/// Standard markdown UI formatting
label.roundCodeCorners = true
label.roundSyntaxCorners = true
/// Custom markdown UI formatting
label.roundAllCorners = true

self.view.addSubview(label)

故事板示例

/// Initialization
@IBOutlet fileprivate weak var label: CDMarkdownLabel!
/// Standard markdown UI formatting
self.label.roundCodeCorners = true
self.label.roundSyntaxCorners = true
/// Custom markdown UI formatting
self.label.roundAllCorners = true

作者

Christopher de Haan, [email protected]


致谢

CDMarkdownKit受到了由Ivan Bruel开发的markdown解析库MarkdownKit的启发。

CDMarkdownKit增加了以下功能

  • 固定标题元素解析
  • 图像元素解析
  • 删除线元素解析
  • 可自定义所有元素的字体
  • 可自定义所有元素的色彩
  • 可自定义所有元素的背景色彩
  • 可自定义所有元素的段落样式
  • 可自定义所有元素的下划线色彩样式
  • 可自定义所有元素的下划线样式
  • 具有为代码、语法或所有元素圆角背景文字色彩角的UITextView功能
  • 具有为代码、语法或所有元素圆角背景文字色彩角的UILabel功能
  • 支持macOS、tvOS和watchOS

许可

CDMarkdownKit适用于MIT许可。有关更多信息,请参阅LICENSE文件。