回精華區
作者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翻