KMBatesManager.swift 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. //
  2. // KMBatesManager.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by tangchao on 2022/12/28.
  6. //
  7. import Cocoa
  8. class KMBatesManager: NSObject {
  9. let kBatesFolderPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("bates")
  10. let kBatesPlistPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("bates").stringByAppendingPathComponent("bates.plist")
  11. static let defaultManager = KMBatesManager()
  12. var datas: Array<KMBatesModel> = []
  13. override init() {
  14. super.init()
  15. print("kBatesPlistPath = \(kBatesPlistPath ?? "")")
  16. if (FileManager.default.fileExists(atPath: kBatesPlistPath!)) {
  17. let dataDict = NSDictionary(contentsOfFile: kBatesPlistPath!)
  18. if (dataDict == nil) {
  19. return
  20. }
  21. for keyIndex in 0 ..< (dataDict?.allKeys.count)! {
  22. let key: String = dataDict?.allKeys[keyIndex] as! String
  23. let modelDict: NSDictionary = dataDict?.object(forKey: key) as! NSDictionary
  24. let model = parseDictionary(dict: modelDict)
  25. model.tag = key
  26. self.datas.append(model)
  27. }
  28. /// 根据id进行排序(升序)
  29. self.datas.sort(){$0.tag > $1.tag}
  30. }
  31. }
  32. func addTemplate(_ model: KMBatesModel) -> Bool {
  33. if (!FileManager.default.fileExists(atPath: kBatesFolderPath!)) {
  34. let create: ()? = try?FileManager.default.createDirectory(atPath: kBatesFolderPath!, withIntermediateDirectories: false)
  35. if (create == nil) {
  36. return false
  37. }
  38. }
  39. if (!FileManager.default.fileExists(atPath: kBatesPlistPath!)) {
  40. let create = try?FileManager.default.createFile(atPath: kBatesPlistPath!, contents: nil)
  41. if (create == nil) {
  42. return false
  43. }
  44. }
  45. let dict = NSDictionary(contentsOfFile: kBatesPlistPath!)
  46. var newDict:NSMutableDictionary!
  47. if (dict != nil) {
  48. newDict = NSMutableDictionary(dictionary: dict!)
  49. } else {
  50. newDict = NSMutableDictionary()
  51. }
  52. let modelDict = self.parseModel(model: model)
  53. let tag = model.tag
  54. newDict.addEntries(from: [tag : modelDict])
  55. let result = newDict.write(toFile: kBatesPlistPath!, atomically: true)
  56. if (result) {
  57. if (self.datas.count < 1) {
  58. self.datas.append(model)
  59. } else {
  60. self.datas.insert(model, at: 0)
  61. }
  62. }
  63. return result
  64. }
  65. func deleteTemplate(_ model: KMBatesModel) -> Bool {
  66. if (model.tag.isEmpty) {
  67. return false
  68. }
  69. if (!FileManager.default.fileExists(atPath: kBatesPlistPath!)) {
  70. return false
  71. }
  72. let key: String = model.tag
  73. let dictionary = NSDictionary(contentsOfFile: kBatesPlistPath!)
  74. var newDictionary: NSMutableDictionary!
  75. if (dictionary != nil) {
  76. newDictionary = NSMutableDictionary(dictionary: dictionary!)
  77. } else {
  78. newDictionary = NSMutableDictionary()
  79. }
  80. newDictionary.removeObject(forKey: key)
  81. let result = newDictionary.write(toFile: kBatesPlistPath!, atomically: true)
  82. if (result) {
  83. if (self.datas.contains(model)) {
  84. self.datas.removeObject(model)
  85. }
  86. }
  87. return result
  88. }
  89. func deleteAllTemplate() -> Bool {
  90. if (!FileManager.default.fileExists(atPath: kBatesPlistPath!)) {
  91. return false
  92. }
  93. let dictionary = NSDictionary(contentsOfFile: kBatesPlistPath!)
  94. var newDictionary: NSMutableDictionary!
  95. if (dictionary != nil) {
  96. newDictionary = NSMutableDictionary(dictionary: dictionary!)
  97. } else {
  98. newDictionary = NSMutableDictionary()
  99. }
  100. newDictionary.removeAllObjects()
  101. let result = newDictionary.write(toFile: kBatesPlistPath!, atomically: true)
  102. if (result) {
  103. self.datas.removeAll()
  104. }
  105. return result
  106. }
  107. func updateTemplate(_ model: KMBatesModel) -> Bool {
  108. if (!FileManager.default.fileExists(atPath: kBatesFolderPath!)) {
  109. let create = try?FileManager.default.createDirectory(atPath: kBatesFolderPath!, withIntermediateDirectories: false)
  110. if (create == nil) {
  111. return false
  112. }
  113. }
  114. if (!FileManager.default.fileExists(atPath: kBatesPlistPath!)) {
  115. let create = try?FileManager.default.createFile(atPath: kBatesPlistPath!, contents: nil)
  116. if (create == nil) {
  117. return false
  118. }
  119. }
  120. var flagModel: KMBatesModel!
  121. for model_ in self.datas {
  122. if (model_.tag == model.tag) {
  123. flagModel = model_
  124. break
  125. }
  126. }
  127. if (flagModel == nil) {
  128. return false
  129. }
  130. let dict = NSDictionary(contentsOfFile: kBatesPlistPath!)
  131. var newDict:NSMutableDictionary!
  132. if (dict != nil) {
  133. newDict = NSMutableDictionary(dictionary: dict!)
  134. } else {
  135. newDict = NSMutableDictionary()
  136. }
  137. let modelDict = self.parseModel(model: model)
  138. newDict.setObject(modelDict, forKey: flagModel.tag as NSCopying)
  139. let result = newDict.write(toFile: kBatesPlistPath!, atomically: true)
  140. if (result) {
  141. if let index = self.datas.firstIndex(of: flagModel) {
  142. self.datas[index] = model
  143. }
  144. }
  145. return result
  146. }
  147. func updateModel(_ model: KMBatesModel, with dict: NSDictionary) {
  148. /// 字体相关
  149. model.fontName = dict["fontName"] as! String
  150. model.fontsize = dict["fontsize"] as! CGFloat
  151. if let value = dict.object(forKey: "color") {
  152. model.color = NSColor.km_init(hex: value as! String)
  153. }
  154. /// 页边距
  155. model.leftMargin = dict["leftMargin"] as! Int
  156. model.rightMargin = dict["rightMargin"] as! Int
  157. model.bottomMargin = dict["bottomMargin"] as! Int
  158. model.topMargin = dict["topMargin"] as! Int
  159. /// 内容
  160. model.topLeftString = dict["topLeftString"] as! String
  161. model.topCenterString = dict["topCenterString"] as! String
  162. model.topRightString = dict["topRightString"] as! String
  163. model.bottomLeftString = dict["bottomLeftString"] as! String
  164. model.bottomCenterString = dict["bottomCenterString"] as! String
  165. model.bottomRightString = dict["bottomRightString"] as! String
  166. model.prefixString = dict["prefixString"] as! String
  167. model.suffixString = dict["suffixString"] as! String
  168. model.digits = dict["digits"] as! Int
  169. model.startString = dict["startString"] as! String
  170. model.tag = dict["tag"] as! String
  171. }
  172. /**
  173. `Private Methods`
  174. */
  175. func parseModel(model: KMBatesModel) -> Dictionary<String, Any> {
  176. var dict: [String : Any] = [:]
  177. /// 字体相关
  178. dict["fontName"] = model.fontName
  179. dict["fontsize"] = model.fontsize
  180. dict["color"] = model.color.toHex()
  181. /// 页边距
  182. dict["leftMargin"] = model.leftMargin
  183. dict["rightMargin"] = model.rightMargin
  184. dict["bottomMargin"] = model.bottomMargin
  185. dict["topMargin"] = model.topMargin
  186. /// 内容
  187. dict["topLeftString"] = model.topLeftString
  188. dict["topCenterString"] = model.topCenterString
  189. dict["topRightString"] = model.topRightString
  190. dict["bottomLeftString"] = model.bottomLeftString
  191. dict["bottomCenterString"] = model.bottomCenterString
  192. dict["bottomRightString"] = model.bottomRightString
  193. dict["prefixString"] = model.prefixString
  194. dict["suffixString"] = model.suffixString
  195. dict["digits"] = model.digits
  196. dict["startString"] = model.startString
  197. dict["tag"] = model.tag
  198. return dict
  199. }
  200. private func parseDictionary(dict: NSDictionary) -> KMBatesModel {
  201. let model = KMBatesModel()
  202. /// 字体相关
  203. model.fontName = dict["fontName"] as! String
  204. model.fontsize = dict["fontsize"] as! CGFloat
  205. if let value = dict.object(forKey: "color") {
  206. model.color = NSColor.km_init(hex: value as! String)
  207. }
  208. /// 页边距
  209. model.leftMargin = dict["leftMargin"] as! Int
  210. model.rightMargin = dict["rightMargin"] as! Int
  211. model.bottomMargin = dict["bottomMargin"] as! Int
  212. model.topMargin = dict["topMargin"] as! Int
  213. /// 内容
  214. model.topLeftString = dict["topLeftString"] as! String
  215. model.topCenterString = dict["topCenterString"] as! String
  216. model.topRightString = dict["topRightString"] as! String
  217. model.bottomLeftString = dict["bottomLeftString"] as! String
  218. model.bottomCenterString = dict["bottomCenterString"] as! String
  219. model.bottomRightString = dict["bottomRightString"] as! String
  220. model.prefixString = dict["prefixString"] as! String
  221. model.suffixString = dict["suffixString"] as! String
  222. model.digits = dict["digits"] as! Int
  223. model.startString = dict["startString"] as! String
  224. if let value = dict["tag"] {
  225. model.tag = value as! String
  226. }
  227. return model
  228. }
  229. func fetchBatesAvailableName() -> String {
  230. var availableIndex = 0
  231. for item in datas {
  232. if item.name.hasPrefix("Bates") {
  233. if let index = Int(item.name.dropFirst("Bates".count)), index >= availableIndex {
  234. availableIndex = index + 1
  235. }
  236. }
  237. }
  238. return "Bates\(availableIndex)"
  239. }
  240. }
  241. //Class
  242. extension KMBatesManager {
  243. class func parseModel(model: KMBatesModel, _ pageCount: UInt) -> [String] {
  244. var topLeftString: String = ""
  245. if (!model.topLeftString.isEmpty) {
  246. var string = KMBatesManager.parsePageFormat(formatString: model.topLeftString, startPage: model.startString, pageCount: "\(pageCount)")
  247. string = KMBatesManager.parseDateFormat(formatString: string)
  248. topLeftString = string
  249. }
  250. var topCenterString: String = ""
  251. if (!model.topCenterString.isEmpty) {
  252. var string = KMBatesManager.parsePageFormat(formatString: model.topCenterString, startPage: model.startString, pageCount: "\(pageCount)")
  253. string = KMBatesManager.parseDateFormat(formatString: string)
  254. topCenterString = string
  255. }
  256. var topRightString: String = ""
  257. if (!model.topRightString.isEmpty) {
  258. var string = KMBatesManager.parsePageFormat(formatString: model.topRightString, startPage: model.startString, pageCount: "\(pageCount)")
  259. string = KMBatesManager.parseDateFormat(formatString: string)
  260. topRightString = string
  261. }
  262. var bottomLeftString: String = ""
  263. if (!model.bottomLeftString.isEmpty) {
  264. var string = KMBatesManager.parsePageFormat(formatString: model.bottomLeftString, startPage: model.startString, pageCount: "\(pageCount)")
  265. string = KMBatesManager.parseDateFormat(formatString: string)
  266. bottomLeftString = string
  267. }
  268. var bottomCenterString: String = ""
  269. if (!model.bottomCenterString.isEmpty) {
  270. var string = KMBatesManager.parsePageFormat(formatString: model.bottomCenterString, startPage: model.startString, pageCount: "\(pageCount)")
  271. string = KMBatesManager.parseDateFormat(formatString: string)
  272. bottomCenterString = string
  273. }
  274. var bottomRightString: String = ""
  275. if (!model.bottomRightString.isEmpty) {
  276. var string = KMBatesManager.parsePageFormat(formatString: model.bottomRightString, startPage: model.startString, pageCount: "\(pageCount)")
  277. string = KMBatesManager.parseDateFormat(formatString: string)
  278. bottomRightString = string
  279. }
  280. return [topLeftString, topCenterString, topRightString, bottomLeftString, bottomCenterString, bottomRightString]
  281. }
  282. class func parsePageFormat(formatString: String, startPage: String, pageCount: String) -> String {
  283. var result = formatString
  284. for pageFormat in self.getPageFormats() {
  285. let string = "<<\(pageFormat)>>"
  286. if (result.contains(string)) {
  287. var tempString = ""
  288. if (string == "<<1>>") {
  289. tempString.append("<<\(startPage)>>")
  290. } else if (string == "<<1 of n>>") {
  291. tempString.append("<<\(startPage)>>")
  292. tempString.append(" of \(pageCount)")
  293. } else if (string == "<<1/n>>") {
  294. tempString.append("<<\(startPage)>>")
  295. tempString.append("/\(pageCount)")
  296. } else if (string == "<<Page 1>>") {
  297. tempString.append("Page \(startPage)")
  298. } else if (string == "<<Page 1 of n>>") {
  299. tempString.append("Page \(startPage)")
  300. tempString.append("of \(pageCount)")
  301. }
  302. result = result.replacingOccurrences(of: string, with: tempString)
  303. }
  304. }
  305. return result
  306. }
  307. class func parseDateFormat(formatString: String) -> String {
  308. var result: String = formatString
  309. for dateFormat in self.getDateFormats() {
  310. if (result.contains(dateFormat)) {
  311. var formatString: String = dateFormat.replacingOccurrences(of: "m", with: "M")
  312. var replace = "<<\(dateFormat)>>"
  313. let date = Date()
  314. let dateFormatter = DateFormatter()
  315. dateFormatter.dateFormat = formatString
  316. var dateString = dateFormatter.string(from: date)
  317. result = result.replacingOccurrences(of: replace, with: dateString)
  318. }
  319. }
  320. return result
  321. }
  322. class func getPageFormats() -> [String] {
  323. return ["1",
  324. "1 of n",
  325. "1/n",
  326. "Page 1",
  327. "Page 1 of n"]
  328. }
  329. @objc class func getDateFormats() -> [String] {
  330. return ["m/d", "m/d/yy", "m/d/yyyy",
  331. "mm/dd/yy", "mm/dd/yyyy",
  332. "d/m/yy", "d/m/yyyy",
  333. "dd/mm/yy", "dd/mm/yyyy",
  334. "mm/yy", "mm/yyyy",
  335. "m.d.yy", "m.d.yyyy",
  336. "mm.dd.yy", "mm.dd.yyyy", "mm.yy", "mm.yyyy",
  337. "d.m.yy", "d.m.yyyy",
  338. "dd.mm.yy", "dd.mm.yyyy",
  339. "yy-mm-dd",
  340. "yyyy-mm-dd"]
  341. }
  342. }