]> git.plutz.net Git - cgilite/commitdiff
md: heading identifiers
authorPaul Hänsch <paul@plutz.net>
Thu, 8 Jul 2021 22:36:52 +0000 (00:36 +0200)
committerPaul Hänsch <paul@plutz.net>
Thu, 8 Jul 2021 22:36:52 +0000 (00:36 +0200)
markdown.awk

index 973818067497779dc286f234b1c1ed489f2e4dfe..512be5d5723da1f9a049bb1ba31241d813dba5ac 100755 (executable)
@@ -43,6 +43,7 @@
 # Extensions - Block elements:
 # ----------------------------
 # -  ?  Heading identifiers (php md, pandoc)
+# - [x] Automatic heading identifiers (custom)
 # - [x] Fenced code blocks (php md, pandoc)
 #   - [-] Fenced code attributes
 # - [ ] Tables
@@ -347,21 +348,25 @@ function _block( block, LOCAL, st, len, hlvl, htxt, guard, code, indent ) {
   # First Order Heading
   } else if ( match( block, /^[^\n]+\n===+(\n|$)/ ) ) {
     len = RLENGTH;
-    return "<h1>" inline( gensub( /\n.*$/, "", "g", block ) ) "</h1>\n\n" \
+    HL[1]++; HL[2] = 0; HL[3] = 0; HL[4] = 0; HL[5] = 0; HL[6] = 0;
+    return "<h1 id=\"" HL[1] " - " HTML(gensub( /\n.*$/, "", "g", block )) "\">" inline( gensub( /\n.*$/, "", "g", block ) ) "</h1>\n\n" \
            _block( substr( block, len + 1 ) );
 
   # Second Order Heading
   } else if ( match( block, /^[^\n]+\n---+(\n|$)/ ) ) {
     len = RLENGTH;
-    return "<h2>" inline( gensub( /\n.*$/, "", "g", block ) ) "</h2>\n\n" \
+    HL[2]++; HL[3] = 0; HL[4] = 0; HL[5] = 0; HL[6] = 0;
+    return "<h2 id=\"" HL[1] "." HL[2] " - " HTML(gensub( /\n.*$/, "", "g", block )) "\">" inline( gensub( /\n.*$/, "", "g", block ) ) "</h2>\n\n" \
            _block( substr( block, len + 1) );
 
   # Nth Order Heading
-  } else if ( match( block, /^#{1,6}[[:space:]]*[^\n]+([[:space:]]*#*)(\n|$)/ ) ) {
+  } else if ( match( block, /^#{1,6}[ \t]*[^\n]+([ \t]*#*)(\n|$)/ ) ) {
     len = RLENGTH;
     hlvl = length( gensub( /^(#{1,6}).*$/, "\\1", "g", block ) );
-    htxt = gensub( /[[:space:]]*#*$/, "", "1", gensub( /^#{1,6}[[:space:]]*([^\n]+)([[:space:]]*#*)\n.*$/, "\\1", "g", block ) )
-    return "<h" hlvl ">" inline( htxt ) "</h" hlvl ">\n\n" \
+    htxt = gensub(/^#{1,6}[ \t]*(([^ \t\n]+|[ \t]+[^ \t\n#]|[ \t]+#+[^\n#])+)([ \t]*#*)(\n.*)?$/, "\\1", 1, block);
+    HL[hlvl]++; for ( n = hlvl + 1; n < 7; n++) { HL[n] = 0;}
+    hid = HL[1]; for ( n = 2; n <= hlvl; n++) { hid = hid "." HL[n] ; }
+    return "<h" hlvl " id=\"" hid " - " HTML(htxt) "\">" inline( htxt ) "</h" hlvl ">\n\n" \
            _block( substr( block, len + 1) );
 
   # Plain paragraph
@@ -409,6 +414,7 @@ BEGIN {
   # Global Vars
   file = ""; rl_href[""] = ""; rl_title[""] = "";
   if (ENVIRON["MD_HTML"] == "true") { AllowHTML = "true"; }
+  HL[1] = 0; HL[2] = 0; HL[3] = 0; HL[4] = 0; HL[5] = 0; HL[6] = 0;
 
   # Buffering of full file ist necessary, e.g. to find reference links
   while (getline) { file = file $0 "\n"; }