APIDocGenerator.swift 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. //
  2. // APIDocGenerator.swift
  3. // C Code Develop
  4. //
  5. // Created by 邢铖 on 2022/7/4.
  6. // Copyright © 2022 xcbosa. All rights reserved.
  7. //
  8. import WebKit
  9. public class APIDocGenerator: NSObject, WKNavigationDelegate {
  10. static let templateHtml = (try? String(contentsOf: URL(fileURLWithPath: (Bundle.main.resourcePath ?? "") + "/MarkdownView/template.html"))) ?? ""
  11. private var webView: WKWebView
  12. public init(webView: WKWebView) {
  13. self.webView = webView
  14. super.init()
  15. }
  16. public func generateAsync(_ markdown: APIDocMarkdownGenerable, linkPrefix: String = "https://docs.forgetive.org", rootBlock: ProvideRootMarkdownBlock?, completion: @escaping (String) -> Void) {
  17. let prefixBackup = markdown.linkPathPrefix
  18. let languageBackup = markdown.language
  19. let rootBlockBkup = markdown.provideRootMarkdownBlock
  20. defer {
  21. markdown.linkPathPrefix = prefixBackup
  22. markdown.language = languageBackup
  23. markdown.provideRootMarkdownBlock = rootBlockBkup
  24. }
  25. markdown.linkPathPrefix = linkPrefix
  26. let languages = [ElementDefs.SupportedLanguage.english, .chinese]
  27. var fileCode = Self.templateHtml
  28. let group = DispatchGroup()
  29. fileCode = fileCode
  30. .replacingOccurrences(of: "{{PARSED_TITLE}}", with: markdown.navigationItemTitle)
  31. .replacingOccurrences(of: "{{PARSED_BACKGROUND}}", with: UIColor.systemBackground.resolvedColor(with: webView.traitCollection).hexString)
  32. .replacingOccurrences(of: "{{PARSED_FOREGROUND}}", with: UIColor.label.resolvedColor(with: webView.traitCollection).hexString)
  33. for language in languages {
  34. let language = language
  35. markdown.language = language
  36. markdown.provideRootMarkdownBlock = rootBlock
  37. let markdownText = markdown.generateMarkdown()
  38. group.enter()
  39. webView.evaluateJavaScript("parseMarkdown(\(codeToJsStr(content: markdownText)))") {
  40. result, error in
  41. if error == nil, let result = result as? String {
  42. fileCode = fileCode.replacingOccurrences(of: "{{PARSED_HTML_\(language)}}", with: result)
  43. }
  44. group.leave()
  45. }
  46. }
  47. group.notify(queue: .main) {
  48. completion(fileCode)
  49. }
  50. }
  51. }