All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.prismic.WithFragments.scala Maven / Gradle / Ivy

The newest version!
package io.prismic

import io.prismic.fragments._, StructuredText.Span.Hyperlink

trait WithFragments {

  def fragments: Map[String, Fragment]

  private val IndexedKey = """^([^\[]+)(\[\d+\])?$""".r

  /**
   * Access any fragment by name
   */
  def get(field: String): Option[Fragment] = fragments.get(field).orElse(getAll(field).headOption)

  def linkedDocuments: Iterable[DocumentLink] = fragments.flatMap {
    case (_, link: DocumentLink) => Seq(link)
    case (_, text: StructuredText) => text.blocks.flatMap {
      case textBlock: StructuredText.Block.Text => textBlock.spans.flatMap {
        case Hyperlink(_, _, link:DocumentLink) => Some(link)
        case _ => None
      }
      case _ => Nil
    }
    case (_, group: Group) => group.docs.flatMap(_.linkedDocuments)
    case _ => Nil
  }

  /**
   * Access any fragment sequence by name
   */
  def getAll(field: String): Seq[Fragment] = fragments.collect {
    case (IndexedKey(key, _), fragment) if key == field => fragment
  }.toSeq

  def getLink(field: String): Option[Link] = get(field).flatMap {
    case a: WebLink      => Some(a)
    case a: FileLink    => Some(a)
    case a: DocumentLink => Some(a)
    case a: ImageLink    => Some(a)
    case _               => None
  }

  def getImage(field: String): Option[Image] = get(field).flatMap {
    case a: Image          => Some(a)
    case a: StructuredText => a.blocks.collectFirst { case b: StructuredText.Block.Image => b.view }.map(v => Image(v))
    case _                          => None
  }

  def getAllImages(field: String): Seq[Image] = getAll(field).flatMap {
    case a: Image          => Seq(a)
    case a: StructuredText => a.blocks.collect { case b: StructuredText.Block.Image => b.view }.map(v => Image(v))
    case _                          => Nil
  }

  def getImage(field: String, view: String): Option[Image.View] = get(field).flatMap {
    case a: Image => a.getView(view)
    case a: StructuredText if view == "main" => getImage(field).map(_.main)
    case _ => None
  }

  def getAllImages(field: String, view: String): Seq[Image.View] = getAll(field).flatMap {
    case a: Image => a.getView(view).toSeq
    case a: StructuredText if view == "main" => getAllImages(field).map(_.main)
    case _ => Nil
  }

  def getStructuredText(field: String): Option[StructuredText] = get(field).flatMap {
    case a: StructuredText => Some(a)
    case _                          => None
  }

  def getHtml(field: String, linkResolver: DocumentLinkResolver): Option[String] = get(field).map { f => Fragment.getHtml(f, linkResolver) }

  def getText(field: String): Option[String] = get(field).flatMap {
    case a: StructuredText => Some(a.blocks.collect { case b: StructuredText.Block.Text => b.text }.mkString("\n")).filterNot(_.isEmpty)
    case a: Number         => Some(a.value.toString)
    case a: Color          => Some(a.hex)
    case a: Text           => Some(a.value).filterNot(_.isEmpty)
    case a: Date           => Some(a.value.toString)
    case _                          => None
  }

  def getColor(field: String): Option[Color] = get(field).flatMap {
    case c: Color => Some(c)
    case _                 => None
  }

  def getNumber(field: String): Option[Number] = get(field).flatMap {
    case n: Number => Some(n)
    case _                  => None
  }

  def getDate(field: String): Option[Date] = get(field).flatMap {
    case d: Date => Some(d)
    case _                => None
  }

  def getDate(field: String, pattern: String): Option[String] = get(field).flatMap {
    case d: Date => Some(d.asText(pattern))
    case _                => None
  }

  def getTimestamp(field: String): Option[Timestamp] = get(field).flatMap {
    case t: Timestamp => Some(t)
    case _ => None
  }

  def getEmbed(field: String): Option[Embed] = get(field).flatMap {
    case e: Embed => Some(e)
    case _ => None
  }

  def getGeoPoint(field: String): Option[GeoPoint] = get(field).flatMap {
    case gp: GeoPoint => Some(gp)
    case _                => None
  }

  def getNumber(field: String, pattern: String): Option[String] = getNumber(field).map(_.asText(pattern))

  def getBoolean(field: String): Boolean = get(field).flatMap {
    case a: Text => Option(a.value.toLowerCase).collect {
      case "yes"  => true
      case "true" => true
    }
    case _ => None
  }.getOrElse(false)

  def getGroup(field: String): Option[Group] = get(field).flatMap {
    case g: Group => Some(g)
    case _                 => None
  }

  def getSliceZone(field: String): Option[SliceZone] = get(field).flatMap {
    case s: SliceZone => Some(s)
    case _ => None
  }

  def asHtml(linkResolver: DocumentLinkResolver): String = fragments.keys.map { field =>
    s"""
${getHtml(field, linkResolver).getOrElse("")}
""" }.mkString("\n") }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy