///|
fn pdf_tree_group_count(length : Int) -> Int {
if length <= 10 {
1
} else if length <= 100 {
(length + 9) / 10
} else {
10
}
}
///|
fn PdfDocument::pdf_tree_build_name_tree_range(
self : PdfDocument,
entries : ArrayView[(@core.PdfBytes, @syntax.PdfObject)],
start : Int,
stop : Int,
is_root : Bool,
) -> @syntax.PdfObject {
if stop - start <= 10 {
let items : Array[@syntax.PdfObject] = Array(capacity=(stop - start) * 2)
for i in start.. @syntax.PdfObject {
if entries.length() == 0 {
PdfDictionary([(pdf_tree_names_key(), PdfArray([]))])
} else {
let sorted = pdf_tree_sort_name_entries(entries)
self.pdf_tree_build_name_tree_range(sorted, 0, sorted.length(), true)
}
}
///|
/// Build either a name tree or a number tree from byte-keyed entries.
///
/// When `is_number` is `false`, this delegates to `build_name_tree`. When it is
/// `true`, keys must be signed 32-bit decimal ASCII and are converted to
/// integers before building a number tree; invalid keys raise `@core.PdfError::NumberExpected`.
pub fn pdf_build_name_tree(
is_number : Bool,
document : PdfDocument,
entries : ArrayView[(@core.PdfBytes, @syntax.PdfObject)],
) -> @syntax.PdfObject raise @core.PdfError {
if is_number {
let number_entries : Array[(Int, @syntax.PdfObject)] = Array(
capacity=entries.length(),
)
for entry in entries {
number_entries.push((pdf_tree_number_key_of_bytes(entry.0), entry.1))
}
document.build_number_tree(number_entries)
} else {
document.build_name_tree(entries)
}
}
///|
fn PdfDocument::pdf_tree_build_number_tree_range(
self : PdfDocument,
entries : ArrayView[(Int, @syntax.PdfObject)],
start : Int,
stop : Int,
is_root : Bool,
) -> @syntax.PdfObject {
if stop - start <= 10 {
let items : Array[@syntax.PdfObject] = Array(capacity=(stop - start) * 2)
for i in start.. @syntax.PdfObject {
if entries.length() == 0 {
PdfDictionary([(pdf_tree_nums_key(), PdfArray([]))])
} else {
let sorted = pdf_tree_sort_number_entries(entries)
self.pdf_tree_build_number_tree_range(sorted, 0, sorted.length(), true)
}
}