ref: f31bb1141bf602601ce9f6a2e7ef740be6971afe
parent: 63501b4114128f483943111275314b649517d501
author: cinap_lenrek <cinap_lenrek@rei2.9hal>
date: Tue Feb 21 06:08:05 EST 2012
mothra: linkify
--- a/sys/src/cmd/mothra/rdhtml.c
+++ b/sys/src/cmd/mothra/rdhtml.c
@@ -259,9 +259,37 @@
dst[len]=0;
return dst;
}
+int alnumchar(int c){+ return 'a'<=c && c<='z' || 'A'<=c && c<='Z' || '0'<=c && c<='9';
+}
int entchar(int c){- return c=='#' || 'a'<=c && c<='z' || 'A'<=c && c<='Z' || '0'<=c && c<='9';
+ return c=='#' || alnumchar(c);
}
+
+/* return url if text token looks like a hyperlink */
+char *linkify(char *s){+ if(!cistrncmp(s, "http://", 7))
+ return strdup(s);
+ if(!cistrncmp(s, "https://", 8))
+ return strdup(s);
+ if(!cistrncmp(s, "www.", 4)){+ int d, i;
+
+ d = 1;
+ for(i=4; s[i]; i++){+ if(s[i] == '.'){+ if(s[i-1] == '.')
+ return 0;
+ d++;
+ } else if(!alnumchar(s[i]))
+ break;
+ }
+ if(d >= 2)
+ return smprint("http://%s", s);+ }
+ return 0;
+}
+
/*
* remove entity references, in place.
* Potential bug:
@@ -1041,7 +1069,13 @@
}
break;
case TEXT:
- pl_htmloutput(&g, g.nsp, g.token, 0);
+ if(g.state->link[0]==0 && (str = linkify(g.token))){+ strncpy(g.state->link, str, sizeof(g.state->link));
+ pl_htmloutput(&g, g.nsp, g.token, 0);
+ g.state->link[0] = 0;
+ free(str);
+ } else
+ pl_htmloutput(&g, g.nsp, g.token, 0);
break;
case EOF:
for(;g.state!=g.stack;--g.state)
--
⑨