static int diary_handle_feed_rss(request_rec *r, diary_conf *conf) { HDF *hdf; CSPARSE *cs; NEOERR *cs_err; STRING cs_err_str; ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "diary_handle_feed_rss()"); hdf_init(&hdf); hdf_set_value(hdf, "hdf.loadpaths.1", conf->path); hdf_set_value(hdf, "diary.title", conf->title); hdf_set_value(hdf, "diary.uri", conf->uri); cs_err = hdf_read_file(hdf, INDEX_HDF); if(cs_err){ ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "cannot read index.hdf."); hdf_destroy(&hdf); return HTTP_INTERNAL_SERVER_ERROR; } //hdf_dump(hdf, NULL); cs_err = cs_init(&cs, hdf); if(cs_err){ string_init(&cs_err_str); nerr_error_string(cs_err, &cs_err_str); ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "error at cs_init(): %s", cs_err_str.buf); cs_destroy(&cs); hdf_destroy(&hdf); return HTTP_INTERNAL_SERVER_ERROR; } cgi_register_strfuncs(cs); cs_err = cs_parse_string(cs, strdup(RSS_TMPL), RSS_TMPL_LEN); if(cs_err){ string_init(&cs_err_str); nerr_error_string(cs_err, &cs_err_str); ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "error in cs_parse_string(): %s", cs_err_str.buf); cs_destroy(&cs); hdf_destroy(&hdf); return HTTP_INTERNAL_SERVER_ERROR; } r->content_type = "application/rss+xml"; cs_render(cs, r, diary_cs_render_cb); cs_destroy(&cs); hdf_destroy(&hdf); return OK; }
static void wiki_output(MMIOT *doc, request_rec *r) { char *title; int ret; int size; char *p; wiki_conf *conf; list_t *css; HDF *hdf; CSPARSE *cs; int i; conf = (wiki_conf *) ap_get_module_config(r->per_dir_config, &wiki_module); ret = mkd_compile(doc, MKD_TOC | MKD_AUTOLINK); hdf_init(&hdf); if(conf->name){ hdf_set_value(hdf, "wikiname", conf->name); } title = mkd_doc_title(doc); if(title == NULL){ title = "notitle"; } hdf_set_value(hdf, "title", title); for(i=0, css = conf->css; css; i++, css = (list_t *) css->next){ hdf_set_valuef(hdf, "css.%d=%s", i, (char *)css->data); } if ((size = mkd_document(doc, &p)) != EOF) { hdf_set_value(hdf, "document", p); } cs_init(&cs, hdf); cs_parse_string(cs, strdup(DEFAULT_TEMPLATE), strlen(DEFAULT_TEMPLATE)); cs_render(cs, r, cs_output); hdf_destroy(&hdf); cs_destroy(&cs); }
bool Tree::RenderTemplateInternal(const std::string &tmpl, bool file_or_string, std::ostream *out, std::string *error) const { if (!out) { return false; } CSPARSE *csparse = NULL; HDF *hdf = NULL; NEOERR *err; do { err = hdf_init(&hdf); if (err != STATUS_OK) { break; } if (!SerializeToHdfInternal(hdf, true)) { hdf_destroy(&hdf); if (error) { *error = "SerializationError: serializing to HDF failed"; } return false; } err = cs_init(&csparse, hdf); if (err != STATUS_OK) { break; } err = cgi_register_strfuncs(csparse); if (err != STATUS_OK) { break; } if (file_or_string) { err = cs_parse_file(csparse, tmpl.c_str()); } else { char *ctmpl = strdup(tmpl.c_str()); if (!ctmpl) { cs_destroy(&csparse); hdf_destroy(&hdf); if (error) { *error = "MemoryError: allocating buffer for template"; } break; } err = cs_parse_string(csparse, ctmpl, tmpl.length()); } if (err != STATUS_OK) { break; } err = cs_render(csparse, out, RenderCallback); if (err != STATUS_OK) { break; } } while (false); cs_destroy(&csparse); hdf_destroy(&hdf); if (err != STATUS_OK && error) { STRING str; string_init(&str); nerr_error_string(err, &str); *error = str.buf; string_clear(&str); nerr_ignore(&err); return false; } return true; }