commit 0acda914a5fb512b295ceb5f01fe9357f8657481
parent 4c9b4cf911d1efa01eb885bc555217376d11b03d
Author: awy <awy@awy.one>
Date: Tue, 16 Dec 2025 15:23:02 +0300
render markdown
Diffstat:
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);