///|
let pdf_metadata_xmp_template : String =
  #|
  #|
  #|
  #|
  #|
  #| 
  #|  CREATEDATE
  #|  MODDATE
  #|  PRODUCER
  #|  CREATOR
  #|  TITLE
  #|  SUBJECT
  #|  AUTHOR
  #|  KEYWORDS
  #|  TRAPPED
  #| 
  #|
  #| 
  #|   CREATEDATE
  #|   CREATOR
  #|   MODDATE
  #|   METADATADATE
  #| 
  #|
  #| 
  #|   
  #|   
  #|     TITLE
  #|   
  #|   
  #| 
  #|
  #|
  #|
  #|
  #|
  #|

///|
fn pdf_metadata_replace_all(
  text : String,
  old : String,
  new : String,
) -> String {
  let mut output = text
  if old == "" {
    output
  } else {
    while output.contains(old) {
      output = output.replace(old~, new~)
    }
    output
  }
}

///|
fn PdfDocument::pdf_metadata_template_replacements(
  self : PdfDocument,
) -> Array[(String, String)] raise @core.PdfError {
  let info = fn(name : String) -> String {
    self.info_utf8(pdf_metadata_name(name))
  }
  let creation_date = match info("/CreationDate") {
    "" => pdf_metadata_expand_date("now")
    value => value
  }
  let mod_date = match info("/ModDate") {
    "" => pdf_metadata_expand_date("now")
    value => value
  }
  [
    ("CREATEDATE", pdf_metadata_xmp_date(creation_date)),
    ("MODDATE", pdf_metadata_xmp_date(mod_date)),
    ("PRODUCER", info("/Producer")),
    ("CREATOR", info("/Creator")),
    ("TITLE", info("/Title")),
    ("SUBJECT", info("/Subject")),
    ("AUTHOR", info("/Author")),
    ("KEYWORDS", info("/Keywords")),
    ("TRAPPED", info("/Trapped")),
    ("METADATADATE", pdf_metadata_xmp_date(pdf_metadata_expand_date("now"))),
  ]
}