예제 #1
0
파일: doc.c 프로젝트: echoline/echsml
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;
}
예제 #2
0
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;
}