Changes between Version 2 and Version 3 of Development/PlugIns/JavaScript


Ignore:
Timestamp:
Nov 29, 2006 12:04:59 AM (13 years ago)
Author:
timothy
Comment:

Added an example plugin.

Legend:

Unmodified
Added
Removed
Modified
  • Development/PlugIns/JavaScript

    v2 v3  
    1616 
    1717''(for more information come to our [irc://irc.freenode.net/#colloquy chat room])'' 
     18 
     19 
     20---- 
     21 
     22= Example Plugin: Grab URL Titles = 
     23 
     24The following example will take a URL mentioned in the chat and get it's title by fetching the HTML. Save this script in [wiki:Development/PlugIns#InstallingPlugInsforColloquy Colloquy's PlugIns folder] as "Grab Title.js" and `/reload plugins` in Colloquy. '''Note: this script requires build [3436] or later.''' 
     25 
     26{{{ 
     27var ignoreExtensions = { 'mp3': 1, 'jpg': 1, 'jpeg': 1, 'bmp': 1, 'gif': 1, 'png': 1, 
     28        'jp2': 1, 'tif': 1, 'tiff': 1, 'zip': 1, 'dmg': 1, 'sit': 1, 'sitx': 1, 'pdf': 1, 
     29        'mov': 1, 'avi': 1, 'wmv': 1, 'mpg': 1, 'swf': 1, 'rar': 1, 'aiff': 1, 'aif': 1, 'm4p': 1 }; 
     30 
     31var titleCache = {}; 
     32var enabled = true; 
     33 
     34function processUserCommand(command, arguments, connection, view) { 
     35        if( command == 'grabtitle' ) { 
     36                if( arguments == 'enable' || arguments == 'on' || arguments == 'yes' ) { 
     37                        view.addEventMessageToDisplay('Grab Title enabled.', 'grabTitleEnabled', null ); 
     38                        enabled = true; 
     39                } else if( arguments == 'disable' || arguments == 'off' || arguments == 'no' ) { 
     40                        view.addEventMessageToDisplay('Grab Title disabled.', 'grabTitleDisabled', null ); 
     41                        enabled = false; 
     42                } else if( arguments == 'reset' || arguments == 'clear' || arguments == 'forget' ) { 
     43                        view.addEventMessageToDisplay('Grab Title cache cleared.', 'grabTitleReset', null ); 
     44                        titleCache = {}; 
     45                } 
     46 
     47                return true; 
     48        } 
     49 
     50        return false; 
     51} 
     52 
     53function processIncomingMessage(message, view) { 
     54        if( ! enabled ) return; 
     55 
     56        var html = message.bodyAsHTML(); 
     57        var final = html; 
     58        var linkRegex = /<a href="([^"]+)">([^<]+)<\/a>/gim; 
     59        var result; 
     60        while( ( result = linkRegex.exec( html ) ) ) { 
     61                var url = result[1]; 
     62                if( ! /https?:\/\//.test(url) ) 
     63                        continue; 
     64                if( url != result[2] && url != 'http://' + result[2] ) 
     65                        continue; 
     66 
     67                var extensionRegex = /\.(\w+)$/; 
     68                var extensionResult = extensionRegex.exec( url ); 
     69                if( extensionResult && ignoreExtensions[extensionResult[1].toLowerCase()] ) 
     70                        continue; 
     71 
     72                var title = titleCache[url]; 
     73 
     74                if( title === undefined ) { 
     75                        try { 
     76                                var req = new XMLHttpRequest(); 
     77                                req.open( 'GET', url, false ); 
     78                                req.send(); 
     79 
     80                                if( req.status == 200 ) { 
     81                                        var titleRegex = /<title>([^<]*)<\/title>/gmi; 
     82                                        var titleResult = titleRegex.exec( req.responseText ); 
     83                                        if( titleResult ) { 
     84                                                title = titleResult[1]; 
     85                                                titleCache[url] = title; 
     86                                        } else titleCache[url] = null; 
     87                                } else titleCache[url] = null; 
     88                        } catch( err ) { 
     89                                titleCache[url] = null; 
     90                        } 
     91                } 
     92 
     93                if( title ) final = final.replace( result[0], '<a href="' + url + '" title="' + url + '">' + title + '</a>' ); 
     94        } 
     95 
     96        message.setBodyAsHTML( final ); 
     97} 
     98}}}