(self, f: IO[bytes])
| 176 | ) | set(self.new_entries.keys()) |
| 177 | |
| 178 | def write(self, f: IO[bytes]) -> int: |
| 179 | keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) |
| 180 | deleted_keys = sorted(set(self.deleted_entries.keys())) |
| 181 | startxref = f.tell() |
| 182 | f.write(b"xref\n") |
| 183 | while keys: |
| 184 | # find a contiguous sequence of object IDs |
| 185 | prev: int | None = None |
| 186 | for index, key in enumerate(keys): |
| 187 | if prev is None or prev + 1 == key: |
| 188 | prev = key |
| 189 | else: |
| 190 | contiguous_keys = keys[:index] |
| 191 | keys = keys[index:] |
| 192 | break |
| 193 | else: |
| 194 | contiguous_keys = keys |
| 195 | keys = [] |
| 196 | f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) |
| 197 | for object_id in contiguous_keys: |
| 198 | if object_id in self.new_entries: |
| 199 | f.write(b"%010d %05d n \n" % self.new_entries[object_id]) |
| 200 | else: |
| 201 | this_deleted_object_id = deleted_keys.pop(0) |
| 202 | check_format_condition( |
| 203 | object_id == this_deleted_object_id, |
| 204 | f"expected the next deleted object ID to be {object_id}, " |
| 205 | f"instead found {this_deleted_object_id}", |
| 206 | ) |
| 207 | try: |
| 208 | next_in_linked_list = deleted_keys[0] |
| 209 | except IndexError: |
| 210 | next_in_linked_list = 0 |
| 211 | f.write( |
| 212 | b"%010d %05d f \n" |
| 213 | % (next_in_linked_list, self.deleted_entries[object_id]) |
| 214 | ) |
| 215 | return startxref |
| 216 | |
| 217 | |
| 218 | class PdfName: |
no test coverage detected