Monday, November 08, 2010 at 12:01 AM.
system.verbs.apps.twitter.hotUpText
on hotUpText (s) { <<Changes <<5/7/09; 11:07:32 AM by DW <<Actually numeric characters are allowed in screennames, it turns out. <<Example: http://twitter.com/chrisbrewer62 <<5/6/09; 6:52:05 AM by DW <<Hot-up http:// links too. <<5/5/09; 6:31:56 PM by DW <<Don't treat the #9835 in ♫ as a hash tag. <<5/5/09; 6:21:22 PM by DW <<Hashes allow numeric characters where screen names do not. Example: it's this... #time100gala <<Update: My code update got into the hashtag used in its example: <<http://images.scripting.com/archiveScriptingCom/2009/05/05/coolness.gif <<Heh. ;-) <<5/5/09; 3:02:59 PM by DW <<Hot-up @ and # in tweet text. bundle { //string replacements s = string.replaceall (s, lf, " ")}; bundle { //hot-up http:// links local (s1 = ""); loop { local (ix = string.patternmatch ("http://", string.lower (s))); if ix == 0 { break}; local (url = "", ch); for i = ix to sizeof (s) { ch = s [i]; if ch == ' ' { break}; url = url + ch}; linktext = "<a href=\"" + url + "\">" + url + "</a>"; s1 = s1 + string.mid (s, 1, ix-1) + linktext; s = string.delete (s, 1, ix + sizeof (url) - 1)}; s = s1 + s}; bundle { //hot-up @ and # local (i = 1, ch, chprev = ' '); on hotword (chstart, url, flnumericallowed=false) { <<i points to the delimiter char, we advance i to the first character that's not part of the word, hot it up and return. local (ixend = sizeof (s)); for ix = i+1 to sizeof (s) { local (ch = s [ix], flstay = false); if string.isalpha (ch) or (ch == "_") { flstay = true}; if flnumericallowed { if string.isnumeric (ch) { flstay = true}}; if not flstay { ixend = ix - 1; break}}; local (word = string.mid (s, i+1, ixend-i)); if sizeof (word) == 0 { i = i + 1; return}; local (linktext = "<a href=\"" + url + word + "\">" + chstart + word + "</a>"); s = string.delete (s, i, sizeof (word) + 1); s = string.insert (linktext, s, i); i = i + sizeof (linktext)}; loop { if i > sizeof (s) { break}; ch = s [i]; if ch == "@" { hotword (ch, "http://twitter.com/", true)} else { if ch == "#" { if chprev != "&" { //don't treat ♫ as a hash tag hotword (ch, "http://search.twitter.com/search?q=%23", true)} else { i++}} else { i++}}; chprev = ch}}; return (s)} <<bundle //test code <<local (s = config.godTweets.calendar.["2009"].["05"].["06"].["01038"].text) <<okchars = {"#", ":", "/", ".", " ", "?", "!"} <<for i = 1 to sizeof (s) <<ch = s [i] <<if (not string.isnumeric (ch)) and (not string.isalpha (ch)) and (not (okchars contains ch)) <<dialog.alert (i + " " + number (ch) + " " + ch) <<break <<return << << << <<Who’s your fave American Idol finalist who didn’t win? Here’s our Top 9 http <<ptext = hotUpText ("Overheard: \"There's no evil plan. If there *is* an evil plan, it's this...\" #time100gala") <<ptext = hotUpText ("Silversun Pickups \"Lazy Eye\" ♫ http://twt.fm/95685 Excited to see them live at the @kroq weenie roast.") <<config.godTweets.calendar.["2009"].["05"].["06"].["01038"].text <<"Make #Money in May: By cleaning out your closet? Really? Check it out! http://tr.im/kDkS\n#money, #cleaning, #finances" <<ptext = hotUpText (config.godTweets.calendar.["2009"].["05"].["06"].["01038"].text) <<ptext = hotUpText ("hello http://scripting.com/ dolly @me and #family with your http://day.in/ xxx") <<wp.newtextobject (ptext, @scratchpad.processedtext) <<webbrowser.displaytext (ptext)
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.