]> git.plutz.net Git - cgilite/commitdiff
optimized emphasis regex for performance in mawk
authorPaul Hänsch <paul@plutz.net>
Fri, 30 Aug 2024 19:59:59 +0000 (21:59 +0200)
committerPaul Hänsch <paul@plutz.net>
Fri, 30 Aug 2024 19:59:59 +0000 (21:59 +0200)
markdown.awk

index 6e3febe6e4801e0ff29ea8700b7f5d47f046f031..6e1440cbd44fc8b4aa895455a30a5d0998246456 100755 (executable)
@@ -307,6 +307,7 @@ function inline( line, LOCAL, len, text, code, href, guard, ret ) {
       ret = ret HTML(substr( line, 1, RLENGTH)); line = substr(line, RLENGTH + 1);
       continue;
 
+    # strong / em matchers use pre match pattern to make processing cheaper
     #  __strong__$
     } else if ( match(line, "^__(([^_[:space:]]|" ieu ")|([^_[:space:]]|" ieu ")(" nu "|" ieu ")*([^_[:space:]]|" ieu "))__$") ) {
       len = RLENGTH;
@@ -320,7 +321,7 @@ function inline( line, LOCAL, len, text, code, href, guard, ret ) {
       continue;
 
     #  **strong**
-    } else if ( match(line, "^\\*\\*(([^\\*[:space:]]|" iea ")|([^\\*[:space:]]|" iea ")(" na "|" iea ")*([^\\*[:space:]]|" iea "))\\*\\*") ) {
+    } else if ( match(line, "^\\*\\*(([^*[:space:]]|" iea ")|([^*[:space:]]|" iea ")(" na "|" iea ")*([^*[:space:]]|" iea "))\\*\\*") ) {
       len = RLENGTH;
       ret = ret "<strong>" inline( substr( line, 3, len - 4 ) ) "</strong>"; line = substr( line, len + 1 );
       continue;
@@ -338,7 +339,7 @@ function inline( line, LOCAL, len, text, code, href, guard, ret ) {
       continue;
 
     #  *em*
-    } else if ( match(line, "^\\*(([^\\*[:space:]]|" isa ")|([^\\*[:space:]]|" isa ")(" na "|" isa ")*([^\\*[:space:]]|" isa "))\\*") ) {
+    } else if ( match(line, "^\\*(([^*[:space:]]|" isa ")|([^*[:space:]]|" isa ")(" na "|" isa ")*([^*[:space:]]|" isa "))\\*") ) {
       len = RLENGTH;
       ret = ret "<em>" inline( substr( line, 2, len - 2 ) ) "</em>"; line = substr( line, len + 1 );
       continue;
@@ -944,12 +945,12 @@ BEGIN {
   # hls = "0 0 0 0 0 0";
 
   # Universal Patterns
-  nu = "(\\\\\\\\|\\\\[^\\\\]|[^\\\\_]|_[[:alnum:]])*"    # not underline (except when escaped)
-  na = "(\\\\\\\\|\\\\[^\\\\]|[^\\\\\\*])*"  # not asterisk (except when escaped)
-  ieu =  "_([^_[:space:]]|[^_[:space:]]" nu "[^_[:space:]])_"                 # inner <em> (underline)
-  isu = "__([^_[:space:]]|[^_[:space:]]" nu "[^_[:space:]])__"                # inner <strong> (underline)
-  iea =    "\\*([^\\*[:space:]]|[^\\*[:space:]]" na "[^\\*[:space:]])\\*"     # inner <em> (asterisk)
-  isa = "\\*\\*([^\\*[:space:]]|[^\\*[:space:]]" na "[^\\*[:space:]])\\*\\*"  # inner <strong> (asterisk)
+  nu = "([^_\\\\]|\\\\.|_[[:alnum:]])"  # not underline (except when escaped, or inside a word)
+  na = "([^*\\\\]|\\\\.)"               # not asterisk (except when escaped)
+  ieu =  "_([^_[:space:]]|[^_[:space:]]" nu "*[^_[:space:]])_"                 # inner <em> (underline)
+  isu = "__([^_[:space:]]|[^_[:space:]]" nu "*[^_[:space:]])__"                # inner <strong> (underline)
+  iea =    "\\*([^*[:space:]]|[^*[:space:]]" na "*[^*[:space:]])\\*"     # inner <em> (asterisk)
+  isa = "\\*\\*([^*[:space:]]|[^*[:space:]]" na "*[^*[:space:]])\\*\\*"  # inner <strong> (asterisk)
 
   lix="\\[(\\\\[^\n]|[^]\n\\\\[])*\\]"  # link text
   lid="(<(\\\\[^\n]|[^\n<>\\\\])*>|(\\\\.|[^()\"'\\\\])+|([^<\n\t ()\\\\]|\\\\[^\n])(\\\\[\n]|[^\n\t \\(\\)\\\\])*)"  # link dest