kisscommunity

kisscommunity.bvnf.space site sources
git clone git://bvnf.space/home/kiss/kisscommunity.git
Log | Files | Refs | Submodules | README

0001-support-tagged-links.patch (2726B)


      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
From 4af3828bdaed433eb56d5d80b2efc1b6721fa5e8 Mon Sep 17 00:00:00 2001
From: aabacchus <ben@bvnf.space>
Date: Thu, 26 May 2022 13:10:01 +0100
Subject: [PATCH] support tagged links

---
 documentation |  8 ++++++++
 smu.c         | 28 ++++++++++++++++++++++++----
 2 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/documentation b/documentation
index 8ce605a..064e516 100644
--- a/documentation
+++ b/documentation
@@ -95,6 +95,14 @@ The resulting HTML-Code
 
 	<a href="http://s01.de/~gottox/index.cgi/proj_smu">smu - simple mark up</a></p>
 
+To make a link to the location in the page, use
+
+	%[myheader]
+
+which results in
+
+	<a href="#myheader" id="myheader">myheader</a>
+
 Lists
 -----
 
diff --git a/smu.c b/smu.c
index 28d413c..74917b9 100644
--- a/smu.c
+++ b/smu.c
@@ -250,7 +250,7 @@ dolineprefix(const char *begin, const char *end, int newblock) {
 
 int
 dolink(const char *begin, const char *end, int newblock) {
-	int img, len, sep, parens_depth = 1;
+	int img = 0, tagged = 0, len, sep, parens_depth = 1;
 	const char *desc, *link, *p, *q, *descend, *linkend;
 	const char *title = NULL, *titleend = NULL;
 
@@ -258,20 +258,26 @@ dolink(const char *begin, const char *end, int newblock) {
 		img = 0;
 	else if(strncmp(begin, "![", 2) == 0)
 		img = 1;
+	else if(strncmp(begin, "%[", 2) == 0)
+		tagged = 1;
 	else
 		return 0;
-	p = desc = begin + 1 + img;
-	if(!(p = strstr(desc, "](")) || p > end)
+	p = desc = begin + 1 + (img || tagged);
+	if(tagged && (!(p = strstr(desc, "]")) || p > end))
+		return 0;
+	if(!tagged && (!(p = strstr(desc, "](")) || p > end))
 		return 0;
 	for(q = strstr(desc, "!["); q && q < end && q < p; q = strstr(q + 1, "!["))
 		if(!(p = strstr(p + 1, "](")) || p > end)
 			return 0;
 	descend = p;
 	link = p + 2;
+	if(tagged)
+		link = desc;
 
 	/* find end of link while handling nested parens */
 	q = link;
-	while(parens_depth) {
+	while(!tagged && parens_depth) {
 		if(!(q = strpbrk(q, "()")) || q > end)
 			return 0;
 		if(*q == '(')
@@ -281,6 +287,11 @@ dolink(const char *begin, const char *end, int newblock) {
 		if(parens_depth && q < end)
 			q++;
 	}
+	if(tagged) {
+		if(!(q = strchr(q, ']')) || q > end)
+			return 0;
+	}
+
 
 	if((p = strpbrk(link, "\"'")) && p < end && q - 1 > p + 1) {
 		sep = p[0]; /* separator: can be " or ' */
@@ -316,6 +327,15 @@ dolink(const char *begin, const char *end, int newblock) {
 		}
 		fputs("/>", stdout);
 	}
+	else if(tagged) {
+		fputs("<a href=\"#", stdout);
+		hprint(link, linkend);
+		fputs("\" id=\"", stdout);
+		hprint(link, linkend);
+		fputs("\">", stdout);
+		hprint(desc, descend);
+		fputs("</a>",stdout);
+	}
 	else {
 		fputs("<a href=\"", stdout);
 		hprint(link, linkend);
-- 
2.36.1