作者tsaikd.bbs@tsaikd.no-ip.org (千人斬) 看板: plan
標題[新增功能] global hdr bhttpd edit more post visio 網頁文章格式
時間地下惡魔城 (2005/08/28 Sun 00:34:33) Updated: 2005/08/28
[新增功能] global.h hdr.h bhttpd.c edit.c more.c post.c visio.c 網頁文章格式
相依:
[修正] window.c 訊息視窗自動調整寬度並可支援多行訊息
功能:
這個 patch 主要的功能是讓類似 bbcode 的語法
能在 bbs 上及 bhttpd 上正確顯示
用途:
我是因為想在 bbs 上寫些像 blog 的東西
可是如果有些圖片想放上去就沒有辦法了
所以這篇 patch 主要是讓 bbs 跟 web 做進一步的連結
讓 bbs 功能更強大
說明:
為了不改到一般純文字文章的顯示
區別一般文章跟網頁文章我是用一個標籤來標記 (POST_HTTP)
在發完文章後,按 Ctrl + W 即可標記為網頁文章
再按一次就回復成一般文章
標記為網頁文章後
若用 bbs 直接瀏覽
則會提醒使用者使用網頁瀏覽本文
並附上網址
因為這個 patch 動到了很多程式
可能會有我沒發現到的 bug
或是我的方法效能很糟
就請各位強者大大有空的話幫忙一下吧...^_^
範例:
example 1:
in normal bbs: <img=abc.jpg>圖片說明</img>
in patched bbs: 圖片說明
in bhttpd: 圖片說明 (下面接了一張abc.jpg的圖片)
example 2:
in normal bbs: <link=http://abc.def/>超連結</link>
in patched bbs: 超連結
in bhttpd: 超連結 (用滑鼠點一下就連過去了)
example 3:
in normal bbs: <lnimg=http://abc.def/,abc.jpg>超連結圖片</lnimg>
in patched bbs: 超連結圖片
in bhttpd: 超連結圖片 (下面接了一張abc.jpg的圖片)
(用滑鼠點一下就連過去了)
example site:
在我的個人 bbs 上的個人板,有一些是屬於網頁型文章的
(telnet://tsaikd.no-ip.org) (P_tsaikd)
有興趣的可以來看看...^_^
: global.h
VAR char currtitle[80]; /* currently selected article title */
+ VAR int currxmode; /* currently selected article xmode */
VAR int currbno; /* currently selected board bno */
VAR usint currbattr; /* currently selected board battr */
: global.h
VAR char *str_ransi INI("\033[m");
+ /* ----------------------------------------------------- */
+ /* BHTTPD 網頁指令設定 */
+ /* ----------------------------------------------------- */
+
+ #define HTTP_CODENUM 3 /* 網頁指令數量 */
+ #define HTTP_CODEMAXLEN 5 + 1 /* 網頁指令最長字數 */
+
+ #ifdef _MAIN_C_
+ VAR char HTML_CODE[HTTP_CODENUM][HTTP_CODEMAXLEN] =
+ {
+ "link", "img", "lnimg"
+ }; /* 網頁指令列表 */
+ #else
+ VAR char HTML_CODE[HTTP_CODENUM][HTTP_CODEMAXLEN];
+ #endif
#undef VAR
#undef INI
: hdr.h
- #define POST_3 0x00000004
+ #define POST_HTTP 0x00000004 /* 有網頁標記的 */
: bhttpd.c:ansi_lnimg() 新增在 ansi_hyperlink() 後面
#ifdef HAVE_HYPERLINK
static void
ansi_lnimg(fpw, src)
FILE *fpw;
uschar *src;
{
int ch, mode;
uschar *textsrc;
/* tsaikd.050827: 因為此 tag 有兩種模式,所以比較麻煩
mode: 0x00 初始化
0x01 有 hyperlink
0x02 有 image */
mode = 0x00;
ch = *src;
if (ch != ',' && ch != '>') /* 判斷是否有 link */
mode |= 0x01;
/* 處理 link 的部份 */
if (mode & 0x01)
{
fputs("<a class=PRE target=_blank href=\"", fpw);
while (ch = *src)
{
if (ch < '#' || ch == '<' || ch == '>' || ch > '~' || ch == ',')
break;
fputc(ch, fpw);
src++;
}
fputs("\">", fpw);
}
/* 先處理被 tag 包起來的文字 */
if (ch == ',' || ch=='>')
textsrc = strstr(src, ">") + 1;
else
textsrc = src;
while (ch = *textsrc)
{
if (ch < '#' || ch == '<' || ch == '>')
break;
fputc(ch, fpw);
textsrc++;
}
if (*src == ',' && *(src+1) != '>') /* 判斷是否有 img */
mode |= 0x02;
src++;
/* 處理 img 的部份 */
if (mode & 0x02)
{
fputs("\n<img src=\"", fpw);
while (ch = *src)
{
if (ch < '#' || ch == '<' || ch == '>' || ch > '~')
break;
fputc(ch, fpw);
src++;
}
fputs("\">", fpw);
}
/* 結尾補上 html 的 tag */
if (mode & 0x01)
fputs("</a>", fpw);
if (mode & 0x02)
fputs("\n", fpw);
}
#endif
: bhttpd.c:ansi_html()
ansi_tag(fpw);
continue;
}
+ /* tsaikd.050821: 加入自定超連結 */
+ int code_len;
+ code_len = strlen("<link>");
+ if (!str_ncmp(src - 1, "<link=", code_len) && strstr(src, "</link>"))
+ {
+ src += (code_len - 1);
+ ansi_lnimg(fpw, src);
+ src = strstr(src, "</link>") + code_len + 1;
+ ch2 = *src;
+ continue;
+ }
+ code_len = strlen("<img>");
+ if (!str_ncmp(src - 1, "<img=", code_len) && strstr(src, "</img>"))
+ {
+ src += (code_len - 2);
+ *src = ',';
+ ansi_lnimg(fpw, src);
+ src = strstr(src, "</img>") + code_len + 1;
+ ch2 = *src;
+ continue;
+ }
+ code_len = strlen("<lnimg>");
+ if (!str_ncmp(src - 1, "<lnimg=", code_len) && strstr(src, "</lnimg>"))
+ {
+ src += (code_len - 1);
+ ansi_lnimg(fpw, src);
+ src = strstr(src, "</lnimg>") + code_len + 1;
+ ch2 = *src;
+ continue;
+ }
/* 剩下的字元做html轉換 */
if (ch1 == '<')
{
: edit.c:ansi2n()
break;
}
continue;
}
+ else if ((currxmode & POST_HTTP) && (ch == '<'))
+ { /* tsaikd.050827: 計算網頁合法指令長度 */
+ uschar *tmpstr;
+ int code_index, code_len;
+ uschar code_st[HTTP_CODEMAXLEN + 3], code_end[HTTP_CODEMAXLEN + 3];
+
+ tmpstr = tmp;
+ for (code_index=0 ; code_index<HTTP_CODENUM ; code_index++)
+ {
+ sprintf(code_st, "<%s=", HTML_CODE[code_index]);
+ code_len = strlen(code_st);
+ sprintf(code_end, "</%s>", HTML_CODE[code_index]);
+
+ if (!str_ncmp(tmpstr, code_st, code_len) ||
+ !str_ncmp(tmpstr, code_end, code_len + 1))
+ {
+ while (ch)
+ {
+ ch = *++tmp;
+ if (ch == '>')
+ {
+ tmp++;
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
if (ansix <= 0)
: edit.c:n2ansi()
break;
}
continue;
}
+ else if ((currxmode & POST_HTTP) && (ch == '<'))
+ { /* tsaikd.050827: 計算網頁合法指令長度 */
+ uschar *tmpstr;
+ int code_index, code_len;
+ uschar code_st[HTTP_CODEMAXLEN + 3], code_end[HTTP_CODEMAXLEN + 3];
+
+ tmpstr = tmp;
+ for (code_index=0 ; code_index<HTTP_CODENUM ; code_index++)
+ {
+ sprintf(code_st, "<%s=", HTML_CODE[code_index]);
+ code_len = strlen(code_st);
+ sprintf(code_end, "</%s>", HTML_CODE[code_index]);
+
+ if (!str_ncmp(tmpstr, code_st, code_len) ||
+ !str_ncmp(tmpstr, code_end, code_len + 1))
+ {
+ while (ch)
+ {
+ ch = *++tmp;
+ if (ch == '>')
+ {
+ tmp++;
+ break;
+ }
+ }
+ break;
+ }
+ }
+ if ((tmpstr - tmp) > 2)
+ continue;
+ }
if (tmp >= nxp)
break;
: more.c:more_line()
uschar *pool, *base, *tail;
int ch, len, bytes, in_ansi, in_chi;
+ int in_http;
pool = more_pool;
base = pool + more_base;
tail = base + more_size;
len = bytes = in_ansi = in_chi = 0;
+ in_http = 0;
...
...
if (!strchr(STR_ANSICODE, ch))
in_ansi = 0;
}
+ else if ((currxmode & POST_HTTP) && (ch == '<'))
+ { /* tsaikd.050827: 網頁指令不算入顯示字數 */
+ uschar *tmpstr;
+ int code_index, code_len;
+ uschar code_st[HTTP_CODEMAXLEN + 3], code_end[HTTP_CODEMAXLEN + 3];
+
+ tmpstr = base - 1;
+ for (code_index=0 ; code_index<HTTP_CODENUM ; code_index++)
+ {
+ sprintf(code_st, "<%s=", HTML_CODE[code_index]);
+ code_len = strlen(code_st);
+ sprintf(code_end, "</%s>", HTML_CODE[code_index]);
+
+ if ((!str_ncmp(tmpstr, code_st, code_len)) ||
+ (!str_ncmp(tmpstr, code_end, code_len + 1)))
+ in_http = 1;
+ }
+ }
+ else if (in_http)
+ {
+ if (ch == '>')
+ in_http = 0;
+ }
else if (isprint2(ch))
{
len++;
: post.c:post_browse()
break;
#endif
+ /* tsaikd.050821: 建議使用瀏覽器看網頁型文章 */
+ currxmode = xmode;
+ if (currxmode & POST_HTTP)
+ {
+ char buf[512];
+
+ sprintf(buf, "此文章為網頁格式,建議使用瀏覽器連結\nhttp://%s:%d/bmore?%s&%d", MYHOSTNAME, BHTTP_PORT, currboard, pos+1);
+ vmsg(buf);
+ }
+
hdr_fpath(fpath, dir, hdr);
/* Thor.990204: 為考慮more 傳回值 */
...
...
}
break;
}
+ currxmode = 0;
return post_head(xo);
: post.c 新增以下函式於 post_help() 前面
static int
post_http(xo)
XO *xo;
{
HDR *hdr;
int pos, cur;
pos = xo->pos;
cur = pos - xo->top;
hdr = (HDR *) xo_pool + cur;
hdr->xmode ^= POST_HTTP;
currchrono = hdr->chrono;
#ifdef HAVE_XYPOST
rec_put(xo->dir, hdr, sizeof(HDR), xo->key == XZ_XPOST ? \
hdr->xid : pos, cmpchrono);
#else
rec_put(xo->dir, hdr, sizeof(HDR), pos, cmpchrono);
#endif
return post_load(xo);
}
static int
http_edit(xo)
XO *xo;
{
HDR *hdr;
xo_load(xo, sizeof(HDR));
hdr = (HDR *) xo_pool + (xo->pos - xo->top);
if (!cuser.userlevel) /* tsaikd.050822: guest 不能對其他 guest 的文章修改狀態 */
return XO_NONE;
if (!(bbstate & STAT_BOARD) && strcmp(hdr->owner, cuser.userid)) /* tsaikd.050822: 看板總管跟作者可修改狀態 */
return XO_NONE;
if (hdr->xmode & POST_HTTP)
vmsg("文章狀態改為非網頁格式!");
else
vmsg("文章狀態改為網頁格式!");
return post_http(xo);
}
: post.c:post_edit()
hdr = (HDR *) xo_pool + (xo->pos - xo->top);
+ currxmode = hdr->xmode;
hdr_fpath(fpath, xo->dir, hdr);
...
...
+ currxmode = 0;
/* return post_head(xo); */
: post.c:post_cb[]
+ Ctrl('W'), http_edit,
Ctrl('P'), post_add,
Ctrl('D'), post_prune,
: visio.c:outx()
continue;
}
}
+ else if (currxmode & POST_HTTP) /* tsaikd.050827: 輸出時,不顯示網頁指令 */
+ {
+ if ((*str == '<') && (strstr(str, ">")))
+ {
+ uschar *tmpstr;
+ int code_index, code_len;
+ uschar code_st[HTTP_CODEMAXLEN + 3], code_end[HTTP_CODEMAXLEN + 3];
+
+ tmpstr = str;
+ for (code_index=0 ; code_index<HTTP_CODENUM ; code_index++)
+ {
+ sprintf(code_st, "<%s=", HTML_CODE[code_index]);
+ code_len = strlen(code_st);
+ sprintf(code_end, "</%s>", HTML_CODE[code_index]);
+
+ if ((!str_ncmp(tmpstr, code_st, code_len)) ||
+ (!str_ncmp(tmpstr, code_end, code_len + 1)))
+ {
+ str = strstr(tmpstr, ">") + 1;
+ ch = *str;
+ }
+ }
+ if (!ch)
+ continue;
+ }
+ }
outc(ch);
str++;
--
千 人 斬 KD !! 地下惡魔城 telnet://tsaikd.no-ip.org
K Delete 殺殺殺 殺到你脫褲子 "放屁" !!
i ~~ ● ▄▃▂▁ ︿◎ ︿◎ ︿◎ 快逃啊!!
l ~~ ◤ ̄ ̄ ◤﹀ ◤﹀ ◤﹀
o ~ /∣ ..﹀〉....﹀〉....﹀〉
--
◤◥ Origin: 成大資訊˙地下惡魔城 tsaikd.no-ip.org
◣◢ Author: tsaikd 從 140.116.103.204 發表精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻