CharacterRule.swift 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. //
  2. // CharacterRule.swift
  3. // SwiftyMarkdown
  4. //
  5. // Created by Simon Fairbairn on 04/02/2020.
  6. //
  7. import Foundation
  8. public enum SpaceAllowed {
  9. case no
  10. case bothSides
  11. case oneSide
  12. case leadingSide
  13. case trailingSide
  14. }
  15. public enum Cancel {
  16. case none
  17. case allRemaining
  18. case currentSet
  19. }
  20. public enum CharacterRuleTagType {
  21. case open
  22. case close
  23. case metadataOpen
  24. case metadataClose
  25. case repeating
  26. }
  27. public struct CharacterRuleTag {
  28. let tag : String
  29. let type : CharacterRuleTagType
  30. public init( tag : String, type : CharacterRuleTagType ) {
  31. self.tag = tag
  32. self.type = type
  33. }
  34. }
  35. public struct CharacterRule : CustomStringConvertible {
  36. public let primaryTag : CharacterRuleTag
  37. public let tags : [CharacterRuleTag]
  38. public let escapeCharacters : [Character]
  39. public let styles : [Int : CharacterStyling]
  40. public let minTags : Int
  41. public let maxTags : Int
  42. public var metadataLookup : Bool = false
  43. public var isRepeatingTag : Bool {
  44. return self.primaryTag.type == .repeating
  45. }
  46. public var definesBoundary = false
  47. public var shouldCancelRemainingRules = false
  48. public var balancedTags = false
  49. public var description: String {
  50. return "Character Rule with Open tag: \(self.primaryTag.tag) and current styles : \(self.styles) "
  51. }
  52. public func tag( for type : CharacterRuleTagType ) -> CharacterRuleTag? {
  53. return self.tags.filter({ $0.type == type }).first ?? nil
  54. }
  55. public init(primaryTag: CharacterRuleTag, otherTags: [CharacterRuleTag], escapeCharacters : [Character] = ["\\"], styles: [Int : CharacterStyling] = [:], minTags : Int = 1, maxTags : Int = 1, metadataLookup : Bool = false, definesBoundary : Bool = false, shouldCancelRemainingRules : Bool = false, balancedTags : Bool = false) {
  56. self.primaryTag = primaryTag
  57. self.tags = otherTags
  58. self.escapeCharacters = escapeCharacters
  59. self.styles = styles
  60. self.metadataLookup = metadataLookup
  61. self.definesBoundary = definesBoundary
  62. self.shouldCancelRemainingRules = shouldCancelRemainingRules
  63. self.minTags = maxTags < minTags ? maxTags : minTags
  64. self.maxTags = minTags > maxTags ? minTags : maxTags
  65. self.balancedTags = balancedTags
  66. }
  67. }
  68. enum ElementType {
  69. case tag
  70. case escape
  71. case string
  72. case space
  73. case newline
  74. case metadata
  75. }
  76. struct Element {
  77. let character : Character
  78. var type : ElementType
  79. var boundaryCount : Int = 0
  80. var isComplete : Bool = false
  81. var styles : [CharacterStyling] = []
  82. var metadata : [String] = []
  83. }
  84. extension CharacterSet {
  85. func containsUnicodeScalars(of character: Character) -> Bool {
  86. return character.unicodeScalars.allSatisfy(contains(_:))
  87. }
  88. }