Modify ↓
Opened at 2006-03-18T22:24:43Z
Last modified at 2008-04-09T04:59:17Z
#119 new enhancement
Add basic HTML translation to AIM
| Reported by: | Owned by: | ||
|---|---|---|---|
| Priority: | wishlist | Milestone: | |
| Component: | BitlBee | Version: | 1.0.1 |
| Keywords: | Cc: | ||
| IRC client+version: | Client-independent | Operating System: | Public server |
| OS version/distro: |
Description
Patch to translate between HTML and IRC escape codes:
diff -u bitlbee-1.0.1.orig/bitlbee.h bitlbee-1.0.1/bitlbee.h
--- bitlbee-1.0.1.orig/bitlbee.h Sat Jan 14 07:16:07 2006
+++ bitlbee-1.0.1/bitlbee.h Tue Mar 14 02:45:31 2006
@@ -130,6 +130,9 @@
int bitlbee_save( irc_t *irc );
void bitlbee_shutdown( gpointer data );
double gettime( void );
+G_MODULE_EXPORT void strip_html( char *in );
+G_MODULE_EXPORT void decode_html( char *in );
+G_MODULE_EXPORT char *encode_html( char *in );
G_MODULE_EXPORT void http_encode( char *s );
G_MODULE_EXPORT void http_decode( char *s );
G_MODULE_EXPORT char *strip_newlines(char *source);
diff -u bitlbee-1.0.1.orig/irc.h bitlbee-1.0.1/irc.h
--- bitlbee-1.0.1.orig/irc.h Sat Jan 14 07:13:11 2006
+++ bitlbee-1.0.1/irc.h Tue Mar 14 02:45:08 2006
@@ -32,6 +32,13 @@
#define IRC_LOGIN_TIMEOUT 60
#define IRC_PING_STRING "PinglBee"
+#define IRC_BOLD '\2'
+#define IRC_BOLD_MASK (1 << 0)
+#define IRC_ITALIC '\26'
+#define IRC_ITALIC_MASK (1 << 1)
+#define IRC_UNDER '\37'
+#define IRC_UNDER_MASK (1 << 2)
+
#define UMODES "ais"
#define CMODES "nt"
#define CMODE "t"
diff -u bitlbee-1.0.1.orig/util.c bitlbee-1.0.1/util.c
--- bitlbee-1.0.1.orig/util.c Sat Jan 14 07:13:11 2006
+++ bitlbee-1.0.1/util.c Tue Mar 14 03:29:48 2006
@@ -221,7 +221,6 @@
char *start = in;
char *out = g_malloc( strlen( in ) + 1 );
char *s = out, *cs;
- int i, matched;
memset( out, 0, strlen( in ) + 1 );
@@ -250,34 +249,6 @@
*(s++) = *(in++);
}
}
- else if( *in == '&' )
- {
- cs = ++in;
- while( *in && isalpha( *in ) )
- in ++;
-
- if( *in == ';' ) in ++;
- matched = 0;
-
- for( i = 0; *ent[i].code; i ++ )
- if( g_strncasecmp( ent[i].code, cs, strlen( ent[i].code ) ) == 0 )
- {
- int j;
-
- for( j = 0; ent[i].is[j]; j ++ )
- *(s++) = ent[i].is[j];
-
- matched = 1;
- break;
- }
-
- /* None of the entities were matched, so return the string */
- if( !matched )
- {
- in = cs - 1;
- *(s++) = *(in++);
- }
- }
else
{
*(s++) = *(in++);
@@ -288,10 +259,75 @@
g_free( out );
}
-char *escape_html( const char *html )
+void decode_html( char *in )
+{
+ char *html = in;
+ char *out = g_malloc( strlen( html ) );
+ char *irc = out;
+ char *next;
+ int i;
+
+ while( *html )
+ {
+ if( *html == '<' && ( next = strchr( html + 1, '>' ) ) )
+ {
+ ++html;
+ *strpbrk ( html + 1, " />" ) = '\0';
+
+ if( *html == '/' )
+ ++html;
+
+ if( !g_strcasecmp( html, "b" ) )
+ *irc++ = IRC_BOLD;
+ else if( !g_strcasecmp( html, "i" ) )
+ *irc++ = IRC_ITALIC;
+ else if( !g_strcasecmp( html, "u" ) )
+ *irc++ = IRC_UNDER;
+
+ html = next + 1;
+ continue;
+ }
+ else if( *html == '&' )
+ {
+ next = html + 1;
+ while ( isalpha( *next ) )
+ ++next;
+ if ( *next == ';' )
+ {
+ ++html;
+ *next = '\0';
+ for ( i = 0; *ent[i].code; ++i )
+ if ( !g_strcasecmp( ent[i].code, html) )
+ {
+ int j;
+
+ for ( j = 0; ent[i].is[j]; ++j )
+ *irc++ = ent[i].is[j];
+
+ break;
+ }
+
+ if ( !*ent[i].code )
+ *irc++ = '?';
+
+ html = next + 1;
+ continue;
+ }
+ }
+
+ *irc++ = *html++;
+ }
+ *irc = '\0';
+
+ strcpy( in, out );
+ g_free( out );
+}
+
+char *encode_html( const char *html )
{
const char *c = html;
GString *ret;
+ unsigned flags = 0;
char *str;
if( html == NULL )
@@ -303,6 +339,30 @@
{
switch( *c )
{
+ case IRC_BOLD:
+ g_string_append_c( out, '<' );
+ if( flags & IRC_BOLD_MASK )
+ g_string_append_c( out, '/' );
+ g_string_append( out, "b>" );
+ flags^= IRC_BOLD_MASK;
+ break;
+
+ case IRC_ITALIC:
+ g_string_append_c( out, '<' );
+ if( flags & IRC_ITALIC_MASK )
+ g_string_append_c( out, '/' );
+ g_string_append( out, "i>" );
+ flags^= IRC_ITALIC_MASK;
+ break;
+
+ case IRC_UNDER:
+ g_string_append_c( out, '<' );
+ if( flags & IRC_UNDER_MASK )
+ g_string_append_c( out, '/' );
+ g_string_append( out, "u>" );
+ flags^= IRC_UNDER_MASK;
+ break;
+
case '&':
ret = g_string_append( ret, "&" );
break;
Attachments (0)
Change History (2)
comment:1 Changed at 2006-03-19T13:22:54Z by
comment:2 Changed at 2006-04-01T13:05:33Z by
| Priority: | normal → wishlist |
|---|
Sethk, can you please try to update this patch to the current development version? I changed the format of the HTML entity table.
Note: See
TracTickets for help on using
tickets.

Looks nice. Now I'm starting to regret ever renaming the html setting to strip_html... :-/ There's an irssi script for parsing HTML too, but doing it like this works with every IRC client, which is always nicer.