[功能解释]
在文章列表时,

按 * 键显示文章的信息 (url, 利于直接用web方式查看(比如说有人贴了ppmm的照片))
虽然已经有显示文章链接功能,可是有些文章会死活都显示不出来的 (此bug很牛b, 曾尝试跟踪, 搞不定)
在代码里有这样一个结构:
struct one_key { /* Used to pass commands to the readmenu */
int key;
int (*fptr) ();
};
一个按键, 对应一个函数指针. 用户按一下那个键,就会跳到那个函数处执行。
用户进入版面这个过程对应的是bbs.c里Read()这个函数,
Read会用下面read_comms作为参数去调用read.c里的 i_read函数.
i_read里面进行一些处理后就会进入键盘指令循环: 获取键盘按键, 执行相应函数.
节选一些 read_comms, 如果你熟悉bbs操作, 就明白了。
struct one_key read_comms[] = {
{ '_', underline_post }, /* 设置不可回复标记 */
{ 'r', read_post }, /* 阅读文章 */
{ 'K', skip_post }, /* 跳过文章 */
{ 'd', d_action }, /* 删除文章/解除匿名封禁 */
{ 'E', E_action }, /* 编辑文章/清空回收站 */
{ 'D', del_range }, /* 区段删除文章 */
{ 'm', mark_post }, /* 标记文章 (m) */
{ 'g', digest_post }, /* 标记文章 (g) */
{ 'e', select_post }, /* 标记文章 ($) (monster) */
{ Ctrl('G'), digest_mode }, /* 文摘模式 */
{ '`', digest_mode }, /* 文摘模式 */
{ Ctrl('Y'), pure_mode }, /* 原作模式 (monster) */
{ Ctrl('T'), acction_mode }, /* 多种模式切换 */
{ 't', thesis_mode }, /* 主题模式 */
{ 'T', edit_title }, /* 更改文章标题 */
{ 's', do_select }, /* 选择版面 */
{ Ctrl('C'), do_cross }, /* 转载文章 */
{ Ctrl('E'), process_select_post }, /* 处理选定文章 (monster) */
{ Ctrl('V'), x_lockscreen_silent }, /* 锁屏 (monster) */
{ 'h', mainreadhelp }, /* 显示帮助 */
{ Ctrl('J'), mainreadhelp }, /* 显示帮助 */
{ KEY_TAB, show_b_note }, /* 查看备忘录 */
{ 'z', show_b_secnote }, /* 查看秘密备忘录 */
{ 'x', currboard_announce }, /* 查看精华区 */
{ 'a', a_action }, /* 向后搜索作者/封禁 */
{ '/', title_search_down }, /* 向后搜索标题 */
{ 'b', bmfuncs }, /* 版主特殊功能 */
+ { '*', show_fileinfo }, /* 显示全文链接等, 这是我们要添加的*/
{ '\0', NULL }
};
这些函数的参数一般都是3个:
int ent, 是当前文章(即光标对应的那篇文章)的序号
struct fileheader *fileinfo, 是当前文章的文件头信息(文件名, 作者等)
char *direct 是当前版面索引文件路径(例如: $BBSHOME/boards/Joke/.DIR)
在bbs.c里添加上这个处理函数show_fileinfo:
int
show_fileinfo(int ent, struct fileheader *fileinfo, char *direct)
{
/* get file size */
struct stat st;
char buf[512], filepath[512];
char *t;
strlcpy(buf, direct, sizeof(buf));
if ((t = strrchr(buf, '/')) != NULL)
*t = '\0';
snprintf(filepath, sizeof(filepath), "%s/%s", buf, fileinfo->filename);
if (stat(filepath, &st) != -1)
fileinfo->size = st.st_size;
clear();
move(5, 0);
prints("本文全文链接:\n");
prints("http://%s/bbscon?board=%s&file=%s\n\n",
BBSHOST, currboard, fileinfo->filename);
prints("文章发表时间: %d\n\n", fileinfo->filetime);
prints("文章大小: %d 字节\n\n", fileinfo->size);
return FULLUPDATE;
}
在头文件 include/prototypes.h 里添加上这个函数的原型。
int show_fileinfo(int ent, struct fileheader *fileinfo, char *direct);
好了。
make update; 重启bbsd后就有这个功能了~
没有评论:
发表评论