stagit

static git page generator
git clone https://git.awy.one/stagit
Log | Files | Refs | README | LICENSE

commit 0acda914a5fb512b295ceb5f01fe9357f8657481
parent 4c9b4cf911d1efa01eb885bc555217376d11b03d
Author: awy <awy@awy.one>
Date:   Tue, 16 Dec 2025 15:23:02 +0300

render markdown

Diffstat:
MMakefile | 7+++++--
Mstagit.c | 41+++++++++++++++++++++++++++++++++++++++++
2 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile @@ -11,9 +11,12 @@ DOCPREFIX = ${PREFIX}/share/doc/${NAME} LIBGIT_INC = -I/usr/local/include LIBGIT_LIB = -L/usr/local/lib -lgit2 +LIBMD4C_INC = -I/usr/local/include +LIBMD4C_LIB = -L/usr/local/lib -lmd4c -lmd4c-html + # use system flags. -STAGIT_CFLAGS = ${LIBGIT_INC} ${CFLAGS} -STAGIT_LDFLAGS = ${LIBGIT_LIB} ${LDFLAGS} +STAGIT_CFLAGS = ${LIBGIT_INC} ${LIBMD4C_INC} ${CFLAGS} +STAGIT_LDFLAGS = ${LIBGIT_LIB} ${LIBMD4C_LIB} ${LDFLAGS} STAGIT_CPPFLAGS = -D_XOPEN_SOURCE=700 -D_DEFAULT_SOURCE -D_BSD_SOURCE # Uncomment to enable workaround for older libgit2 which don't support this diff --git a/stagit.c b/stagit.c @@ -16,6 +16,8 @@ #include "compat.h" +#include "md4c-html.h" + #define LEN(s) (sizeof(s)/sizeof(*s)) struct deltainfo { @@ -556,6 +558,36 @@ writefooter(FILE *fp) fputs("</div>\n</body>\n</html>\n", fp); } +void +processmd(const char* output, unsigned int len, void *fp) +{ + fprintf((FILE *)fp, "%.*s", len, output); +} +size_t +writeblobmd(FILE *fp, const git_blob *blob) +{ + size_t n = 0, i, len, prev, ret; + const char *s = git_blob_rawcontent(blob); + len = git_blob_rawsize(blob); + fputs("<div id=\"md\">\n", fp); + /* Counting lines in the file*/ + if (len > 0) { + for (i = 0, prev = 0; i < len; i++) { + if (s[i] != '\n') + continue; + n++; + prev = i + 1; + } + if ((len - prev) > 0) { + n++; + } + ret = md_html(s, len, processmd, fp, MD_FLAG_TABLES | MD_FLAG_TASKLISTS | + MD_FLAG_PERMISSIVEEMAILAUTOLINKS | MD_FLAG_PERMISSIVEURLAUTOLINKS, 0); + } + fputs("</div>\n", fp); + return n; +} + size_t writeblobhtml(FILE *fp, const git_blob *blob, const char *filename) { @@ -950,6 +982,13 @@ writeatom(FILE *fp, int all) return 0; } +int +git_blob_is_markdown_file(const char *filename) +{ + const char *ext = strrchr(filename, '.'); + return ((ext != NULL && (!strcmp (ext+1, "md")))); +} + size_t writeblob(git_object *obj, const char *fpath, const char *filename, size_t filesize, const char *entrypath) { @@ -993,6 +1032,8 @@ writeblob(git_object *obj, const char *fpath, const char *filename, size_t files else fputs("<p>Binary file.</p>\n", fp); } + else if (git_blob_is_markdown_file(filename)) + lc = writeblobmd(fp, (git_blob*)obj); else lc = writeblobhtml(fp, (git_blob *)obj, filename);