aboutsummaryrefslogtreecommitdiff
path: root/Sources/NorgUI/Math/MathBlockView.swift
blob: c29fdb60581cbc90c46a3d84b0af2744bdd2a11b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import SwiftUI

/// Renders a `@math` block asynchronously with a fallback to `VerbatimBlock`.
struct MathBlockView: View {
  @Environment(\.norgTheme) private var theme

  let latex: String

  @State private var rendered: NorgMathImage?

  var body: some View {
    content
      .task(id: renderKey) {
        guard let renderer = theme.mathRenderer else { return }
        rendered = await renderer.render(
          latex: latex, mode: .block, fontSize: theme.mathFontSize, color: nil)
      }
  }

  @ViewBuilder
  private var content: some View {
    if let rendered {
      rendered.swiftUIImage
        .frame(width: rendered.size.width, height: rendered.size.height, alignment: .leading)
        .padding(theme.verbatimPadding)
        .frame(maxWidth: .infinity, alignment: .leading)
        .background(theme.codeBackground, in: RoundedRectangle(cornerRadius: 8))
    } else {
      VerbatimBlock(label: nil, content: latex)
    }
  }

  private var renderKey: String { "\(latex)@\(theme.mathFontSize)" }
}