Doc *new_doc(FILE *docf) { if (docf == NULL) { fprintf(stderr, "docf == NULL\n"); return NULL; } Doc *ret = (Doc*)calloc(1, sizeof(Doc)); if (!ret) { perror("malloc"); return NULL; } ret->file = docf; if (doc_parse(ret)) { perror("doc_parse"); } return ret; }
static int html_walkDocChilds(corto_object o, void *userData) { htmlData_t *data = userData; corto_string description = doc_getDescriptionFromDoc(o, data); corto_string text = doc_getTextFromDoc(o, data); corto_string niceName = doc_getNiceNameFromDoc(o, data); corto_object *docs = corto_alloc(sizeof(corto_object) * corto_scopeSize(o)); corto_id index; corto_object stack[CORTO_MAX_SCOPE_DEPTH]; corto_object ptr = o; corto_int32 sp = data->level; corto_id link; corto_bool noIndex = FALSE; corto_id upper; strcpy(upper, niceName); corto_strupper(upper); if (niceName[0] == '#') { noIndex = TRUE; niceName ++; } corto_string parentId = corto_idof(corto_parentof(o)); if (parentId[0] == '#') parentId++; strcpy(link, parentId); strcat(link, "_"); if (corto_idof(o)[0] == '#') { strcat(link, corto_idof(o) + 1); } else { strcat(link, corto_idof(o)); } /* If level is 0, parse heading as title */ if (!data->level) { data->title = niceName; } else { /* Add index number to header */ index[0] = '\0'; if ((sp > 1) && !noIndex) { while (--sp) { stack[sp - 1] = ptr; ptr = corto_parentof(ptr); } for (; sp < data->level - 1; sp ++) { char num[15]; sprintf(num, "%d", doc_getIndexFromDoc(stack[sp], data)); strcat(index, num); strcat(index, "."); } if (data->level > 2) { index[strlen(index) - 1] = '\0'; } strcat(index, " "); } if (data->level == 1) { corto_buffer_append(&data->content, "<a name=\"%s\"></a>\n<p class=\"section\">%s</p>\n", link, niceName); } else { corto_buffer_append(&data->content, "<a name=\"%s\"></a>\n<h%d>%s%s</h%d>\n", link, data->level, index, niceName, data->level); } if (data->level < 3) { corto_buffer_append(&data->index, "<li class=\"index-h%d\" onclick=\"window.location='#%s'\">%s</li>\n", data->level, link, data->level == 1 ? upper : niceName); } corto_buffer_append(&data->content, "<div class=\"indent\">\n"); if (description && strlen(description)) { if (data->level < 3) { corto_buffer_append(&data->content, "<p class=\"description\">%s</p>\n", description); } else { corto_buffer_append(&data->content, "<p>%s</p>\n", description); } } corto_string parsedText = doc_parse(text); corto_buffer_append(&data->content, "%s\n", parsedText); corto_dealloc(parsedText); } /* Collect documents in order */ corto_objectseq seq = corto_scopeClaim(o); corto_objectseqForeach(seq, doc) { docs[doc_getIndexFromDoc(doc, data) - 1] = doc; } corto_scopeRelease(seq); /* Walk documents in order */ data->level ++; int i; for (i = 0; i < corto_scopeSize(o); i ++) { if (!html_walkDocChilds(docs[i], userData)) { goto error; } } data->level --; corto_buffer_append(&data->content, "</div>\n"); corto_dealloc(docs); return 1; error: return 0; }