///|
/// Parse the translated string of a gettext header entry into metadata fields.
///
/// Lines without a colon are ignored. A line beginning with a space or tab is
/// treated as a continuation of the preceding field.
pub fn parse_header_fields(header : String) -> Map[String, String] {
let fields : Map[String, String] = Map([])
let mut current_key : String? = None
for raw_line in header.split("\n") {
let line = raw_line.to_owned().trim_end(chars="\r").to_owned()
if line == "" {
continue
}
if line.has_prefix(" ") || line.has_prefix("\t") {
match current_key {
Some(key) => {
let continuation = line.trim().to_owned()
let previous = fields.get(key).unwrap_or("")
fields[key] = if previous == "" {
continuation
} else {
previous + " " + continuation
}
}
None => ()
}
continue
}
match line.split_once(":") {
Some((raw_key, raw_value)) => {
let key = raw_key.trim().to_owned()
if key != "" {
fields[key] = raw_value.trim().to_owned()
current_key = Some(key)
}
}
None => current_key = None
}
}
fields
}
///|
/// Return parsed fields from the conventional empty-`msgid` header entry.
pub fn PoFile::metadata(self : PoFile) -> Map[String, String] {
match self.header() {
Some(entry) => parse_header_fields(entry.translations.get(0).unwrap_or(""))
None => {}
}
}