-- Leo's gemini proxy

-- Connecting to git.thebackupbox.net:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

repo: geminiclient
action: commit
revision:
path_from:
revision_from: 0ade454639f0c25fb035d372d7057f1b246649bd:
path_to:
revision_to:

git.thebackupbox.net

geminiclient

git://git.thebackupbox.net/geminiclient

commit 0ade454639f0c25fb035d372d7057f1b246649bd
Author: epoch <epoch@hack.thebackupbox.net>
Date:   Fri Aug 5 06:23:14 2022 +0000

    added header_to_anchor stolen from gemini://nytpu.com/gemlog/files/header_to_anchor.c (thanks nytpu)

diff --git a/gemini2html.c b/gemini2html.c

index 062898ac889b3489627cc40a106170b6c007db92..

index ..df7966535689a8d8a4126191c1edc7454de1f840 100644

--- a/gemini2html.c
+++ b/gemini2html.c
@@ -2,14 +2,41 @@
 #include <string.h>
 #include <stdlib.h>

+#include <stdbool.h>
+#include <ctype.h>
+
 #define LINE_ENDING "\r\n"

+char *
+header_to_anchor(const char *header)
+{
+	if (header == NULL) return NULL;
+
+	size_t header_len = strlen(header);
+	// calloc to ensure that the string is always automatically NUL-terminated
+	char *anchor = calloc(header_len + 1, sizeof(*anchor));
+	if (anchor == NULL) return NULL;
+
+	bool prev_is_dash = false;
+	for (size_t hi = 0, ai = 0; hi < header_len; hi++) {
+		if (isalnum(header[hi])) {
+			anchor[ai++] = tolower(header[hi]);
+			prev_is_dash = false;
+		} else if (!prev_is_dash && (isspace(header[hi]) || header[hi] == '-')) {
+			anchor[ai++] = '-';
+			prev_is_dash = true;
+		}
+	}
+	return anchor;
+}
+
 int main(int argc,char *argv[]) {
   char line[65536];//65535+null
   int h=0;
   char pre=0;
   char list=0;
   char *first;
+  char *tab,*spa;
   char *second;
   char *t,*s;
   int ln=0;
@@ -39,17 +66,9 @@ int main(int argc,char *argv[]) {
     if(!strncmp(line,"## ",3)) h=2;
     if(!strncmp(line,"### ",4)) h=3;
     if(h) {
-      first="";
-      s="";
-      t=strdup(line+h+1);
-      if(strchr(t,' ')) {
-        s=" ";
-        first=strchr(t,' ');
-        *first=0;
-        first++;
-      }
+      t=header_to_anchor(line+h+1);
       if(!ln) printf("<h%d>%s</h%d>%s",h,line+h+1,h,LINE_ENDING);
-      else printf("<h%d id=\"%s\"><a href=\"#%s\">%s</a>%s%s</h%d>%s",h,t,t,t,s,first,h,LINE_ENDING);
+      else printf("<h%d id=\"%s\"><a href=\"#%s\">%s</a></h%d>%s",h,t,t,line+h+1,h,LINE_ENDING);
       free(t);
       continue;
     }
@@ -62,7 +81,22 @@ int main(int argc,char *argv[]) {
     }
     if(!strncmp(line,"=> ",3)) {
       first=line+3;
-      if((second=strchr(first,' '))) {
+      tab=strchr(first,'\t');
+      spa=strchr(first,' ');
+      //this shit can probably be shortened.
+      if(tab && spa) {
+        second = tab<spa?tab:spa;
+      }
+      if(tab && !spa) {
+        second = tab;
+      }
+      if(!tab && spa) {
+        second = spa;
+      }
+      if(!tab && !spa) {
+        second = 0;
+      }
+      if(second) {//need to do this on first tab too.
         *second=0;
         second++;
       } else {

-----END OF PAGE-----

-- Response ended

-- Page fetched on Sun Jun 2 17:34:33 2024