Parse metadata from MO file
This commit is contained in:
parent
d276d106ff
commit
44154d063d
1 changed files with 53 additions and 3 deletions
|
@ -32,6 +32,8 @@ pub type ParseError {
|
||||||
OffsetPastEnd(Int)
|
OffsetPastEnd(Int)
|
||||||
MalformedOffsetTableEntry(BitArray)
|
MalformedOffsetTableEntry(BitArray)
|
||||||
StringNotUTF8(BitArray)
|
StringNotUTF8(BitArray)
|
||||||
|
MetaItemMissing
|
||||||
|
MetaItemIsNotSingular
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type Revision {
|
pub type Revision {
|
||||||
|
@ -49,8 +51,16 @@ pub type Header {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub type MetaData =
|
||||||
|
Dict(String, String)
|
||||||
|
|
||||||
pub type Mo {
|
pub type Mo {
|
||||||
Mo(endianness: Endianness, header: Header, translations: Translations)
|
Mo(
|
||||||
|
endianness: Endianness,
|
||||||
|
header: Header,
|
||||||
|
translations: Translations,
|
||||||
|
metadata: MetaData,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse(mo: BitArray) {
|
pub fn parse(mo: BitArray) {
|
||||||
|
@ -62,7 +72,12 @@ pub fn parse(mo: BitArray) {
|
||||||
)
|
)
|
||||||
use <- bool.guard(
|
use <- bool.guard(
|
||||||
header.string_count == 0,
|
header.string_count == 0,
|
||||||
Ok(Mo(endianness: endianness, header: header, translations: dict.new())),
|
Ok(Mo(
|
||||||
|
endianness: endianness,
|
||||||
|
header: header,
|
||||||
|
translations: dict.new(),
|
||||||
|
metadata: dict.new(),
|
||||||
|
)),
|
||||||
)
|
)
|
||||||
|
|
||||||
let total_size = bit_array.byte_size(mo)
|
let total_size = bit_array.byte_size(mo)
|
||||||
|
@ -81,8 +96,14 @@ pub fn parse(mo: BitArray) {
|
||||||
)
|
)
|
||||||
|
|
||||||
use translations <- result.try(parse_translations(endianness, header, mo))
|
use translations <- result.try(parse_translations(endianness, header, mo))
|
||||||
|
use metadata <- result.try(parse_metadata(translations))
|
||||||
|
|
||||||
Ok(Mo(endianness: endianness, header: header, translations: translations))
|
Ok(Mo(
|
||||||
|
endianness: endianness,
|
||||||
|
header: header,
|
||||||
|
translations: translations,
|
||||||
|
metadata: metadata,
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_magic(body: BitArray) {
|
fn parse_magic(body: BitArray) {
|
||||||
|
@ -226,6 +247,35 @@ fn parse_mo_string(mo: BitArray, length: Int, offset: Int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_metadata(translations) {
|
||||||
|
use meta <- result.try(
|
||||||
|
dict.get(translations, "")
|
||||||
|
|> result.replace_error(MetaItemMissing),
|
||||||
|
)
|
||||||
|
case meta {
|
||||||
|
Plural(..) -> Error(MetaItemIsNotSingular)
|
||||||
|
Singular(content: content, ..) -> {
|
||||||
|
let metadata =
|
||||||
|
content
|
||||||
|
|> string.split("\n")
|
||||||
|
|> list.map(fn(line) { string.split(line, ":") })
|
||||||
|
|> list.map(fn(item) {
|
||||||
|
case item {
|
||||||
|
[] -> #("", "")
|
||||||
|
[key] -> #(string.trim(key), "")
|
||||||
|
[key, ..rest] -> #(
|
||||||
|
string.trim(key),
|
||||||
|
string.trim(string.join(rest, ":")),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|> dict.from_list()
|
||||||
|
|
||||||
|
Ok(metadata)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn le_int_8(int8: BitArray) {
|
fn le_int_8(int8: BitArray) {
|
||||||
case int8 {
|
case int8 {
|
||||||
<<l:size(8), h:size(8)>> -> Ok(reconstruct_ui8(h, l))
|
<<l:size(8), h:size(8)>> -> Ok(reconstruct_ui8(h, l))
|
||||||
|
|
Loading…
Reference in a new issue