Unduplicate dictionary entries
This commit is contained in:
parent
74cd03b5b7
commit
59325dc750
87
book.c
87
book.c
@ -38,6 +38,12 @@ typedef enum {
|
|||||||
BOOK_MODE_HEADING,
|
BOOK_MODE_HEADING,
|
||||||
} Book_Mode;
|
} Book_Mode;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int* offsets;
|
||||||
|
int offset_count;
|
||||||
|
int offset_alloc;
|
||||||
|
} Page;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Helper functions
|
* Helper functions
|
||||||
*/
|
*/
|
||||||
@ -99,18 +105,88 @@ static Book_Block book_read_content(EB_Book* book, EB_Hookset* hookset, const EB
|
|||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void subbook_undupe(Book_Subbook* subbook) {
|
||||||
|
int page_count = 0;
|
||||||
|
for (int i = 0; i < subbook->entry_count; ++i) {
|
||||||
|
const int page_index = subbook->entries[i].text.page + 1;
|
||||||
|
if (page_count < page_index) {
|
||||||
|
page_count = page_index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (page_count == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Page* pages = calloc(page_count, sizeof(Page));
|
||||||
|
|
||||||
|
for (int i = 0; i < subbook->entry_count; ++i) {
|
||||||
|
Book_Entry* entry = subbook->entries + i;
|
||||||
|
Page* page = pages + entry->text.page;
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
for (int j = 0; j < page->offset_count; ++j) {
|
||||||
|
if (entry->text.offset == page->offsets[j]){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found) {
|
||||||
|
if (i + 1 < subbook->entry_count) {
|
||||||
|
subbook->entries[i] = subbook->entries[subbook->entry_count - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
--subbook->entry_count;
|
||||||
|
--i;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (page->offset_count + 1 >= page->offset_alloc) {
|
||||||
|
if (page->offset_alloc == 0) {
|
||||||
|
page->offset_alloc = 32;
|
||||||
|
page->offsets = malloc(page->offset_alloc * sizeof(int));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const int offset_alloc_new = page->offset_alloc * 2;
|
||||||
|
page->offsets = realloc(page->offsets, offset_alloc_new * sizeof(int));
|
||||||
|
page->offset_alloc = offset_alloc_new;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
page->offsets[page->offset_count++] = entry->text.offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < page_count; ++i) {
|
||||||
|
free(pages[i].offsets);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(pages);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void book_undupe(Book* book) {
|
||||||
|
for (int i = 0; i < book->subbook_count; ++i) {
|
||||||
|
subbook_undupe(book->subbooks + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Encoding to JSON
|
* Encoding to JSON
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void entry_encode(json_t* entry_json, Book_Entry* entry) {
|
static void entry_encode(json_t* entry_json, const Book_Entry* entry) {
|
||||||
json_object_set_new(entry_json, "heading", json_string(entry->heading.text));
|
|
||||||
/* json_object_set_new(entry_json, "headingPage", json_integer(entry->heading.page)); */
|
/* json_object_set_new(entry_json, "headingPage", json_integer(entry->heading.page)); */
|
||||||
/* json_object_set_new(entry_json, "headingOffset", json_integer(entry->heading.offset)); */
|
/* json_object_set_new(entry_json, "headingOffset", json_integer(entry->heading.offset)); */
|
||||||
|
if (entry->heading.text != NULL) {
|
||||||
|
json_object_set_new(entry_json, "heading", json_string(entry->heading.text));
|
||||||
|
}
|
||||||
|
|
||||||
json_object_set_new(entry_json, "text", json_string(entry->text.text));
|
|
||||||
/* json_object_set_new(entry_json, "textPage", json_integer(entry->text.page)); */
|
/* json_object_set_new(entry_json, "textPage", json_integer(entry->text.page)); */
|
||||||
/* json_object_set_new(entry_json, "textOffset", json_integer(entry->text.offset)); */
|
/* json_object_set_new(entry_json, "textOffset", json_integer(entry->text.offset)); */
|
||||||
|
if (entry->text.text != NULL) {
|
||||||
|
json_object_set_new(entry_json, "text", json_string(entry->text.text));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void subbook_encode(json_t* subbook_json, const Book_Subbook* subbook) {
|
static void subbook_encode(json_t* subbook_json, const Book_Subbook* subbook) {
|
||||||
@ -118,10 +194,10 @@ static void subbook_encode(json_t* subbook_json, const Book_Subbook* subbook) {
|
|||||||
json_object_set_new(subbook_json, "title", json_string(subbook->title));
|
json_object_set_new(subbook_json, "title", json_string(subbook->title));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subbook->copyright.text != NULL) {
|
|
||||||
json_object_set_new(subbook_json, "copyright", json_string(subbook->copyright.text));
|
|
||||||
/* json_object_set_new(subbook_json, "copyrightPage", json_integer(subbook->copyright.page)); */
|
/* json_object_set_new(subbook_json, "copyrightPage", json_integer(subbook->copyright.page)); */
|
||||||
/* json_object_set_new(subbook_json, "copyrightOffset", json_integer(subbook->copyright.offset)); */
|
/* json_object_set_new(subbook_json, "copyrightOffset", json_integer(subbook->copyright.offset)); */
|
||||||
|
if (subbook->copyright.text != NULL) {
|
||||||
|
json_object_set_new(subbook_json, "copyright", json_string(subbook->copyright.text));
|
||||||
}
|
}
|
||||||
|
|
||||||
json_t* entry_json_array = json_array();
|
json_t* entry_json_array = json_array();
|
||||||
@ -335,5 +411,6 @@ bool book_import(Book* book, const Font_Context* context, const char path[], boo
|
|||||||
eb_finalize_hookset(&eb_hookset);
|
eb_finalize_hookset(&eb_hookset);
|
||||||
eb_finalize_library();
|
eb_finalize_library();
|
||||||
|
|
||||||
|
book_undupe(book);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user