基本原理就是每两个连续空格变成一个空格加一个 。这个是最方便的解决办法但是
并不是最准确的的。a b 这个,不同的浏览器会在a和b之间放不同的空格数。
因为极端的追求效率和清晰,下面拿掉了js_output宏而直接使用宏内容。请一定注意
这个修改只用作大家测试,可能和smthbbs系统以后的更新不兼容!
[bbs@localhost lib]$ diff -up ~/dev/smthcvs/bbs2www/lib/bbslib.c .
--- ~/dev/smthcvs/bbs2www/lib/bbslib.c 2004-04-21 12:03:32.000000000 -0700
+++ ./bbslib.c 2004-05-05 22:00:29.000000000 -0700
@@ -2267,6 +2267,7 @@ void output_ansi_javascript(char *buf, s
char outbuf[512];
int outbuf_len;
size_t article_len = buflen;
+ int spaces = 0;
if (buf == NULL)
return;
@@ -2388,8 +2389,44 @@ void output_ansi_javascript(char *buf, s
STATE_CLR(ansi_state, STATE_QUOTE_LINE);
STATE_SET(ansi_state, STATE_NEW_LINE);
}
- else
- js_output(&buf[i], 1, output);
+ else {
+// js_output(&buf[i], 1, output);
+ switch (buf[i]) {
+ case '&':
+ BUFFERED_OUTPUT(output, "&", 5);
+ break;
+ case '<':
+ BUFFERED_OUTPUT(output, "<", 4);
+ break;
+ case '>':
+ BUFFERED_OUTPUT(output, ">", 4);
+ break;
+ case ' ':
+ if (i > 0 && buf[i-1] == ' ') {
+ spaces = !spaces;
+ if (spaces) {
+ BUFFERED_OUTPUT(output, " ", 1);
+ } else {
+ BUFFERED_OUTPUT(output, " ", 6);
+ }
+ } else {
+ spaces = -1;
+ BUFFERED_OUTPUT(output, " ", 1);
+ }
+ break;
+ case '\'':
+ BUFFERED_OUTPUT(output, "\\\'", 2);
+ break;
+ case '\\':
+ BUFFERED_OUTPUT(output, "\\\\", 2);
+ break;
+ case '\r':
+ BUFFERED_OUTPUT(output, "\\r", 2);
+ break;
+ default:
+ BUFFERED_OUTPUT(output, &(buf[i]), 1);
+ }
+ }
}
if (STATE_ISSET(ansi_state, STATE_FONT_SET)) {
BUFFERED_OUTPUT(output, "</font>", 7);
--