| 6 |
* Copyright (C) 2004-2025 Leaflet <leaflet@leafok.com> |
* Copyright (C) 2004-2025 Leaflet <leaflet@leafok.com> |
| 7 |
*/ |
*/ |
| 8 |
|
|
| 9 |
|
#ifdef HAVE_CONFIG_H |
| 10 |
|
#include "config.h" |
| 11 |
|
#endif |
| 12 |
|
|
| 13 |
#include "article_cache.h" |
#include "article_cache.h" |
| 14 |
#include "lml.h" |
#include "lml.h" |
| 15 |
#include "log.h" |
#include "log.h" |
| 67 |
char header[ARTICLE_HEADER_MAX_LEN]; |
char header[ARTICLE_HEADER_MAX_LEN]; |
| 68 |
size_t header_len; |
size_t header_len; |
| 69 |
long header_line_cnt; |
long header_line_cnt; |
| 70 |
|
size_t body_len; |
| 71 |
|
long body_line_cnt; |
| 72 |
char footer[ARTICLE_FOOTER_MAX_LEN]; |
char footer[ARTICLE_FOOTER_MAX_LEN]; |
| 73 |
size_t footer_len; |
size_t footer_len; |
| 74 |
long footer_line_cnt; |
long footer_line_cnt; |
| 117 |
p_article->username, p_article->nickname, p_section->sname, p_section->stitle, p_article->title, BBS_name, str_sub_dt); |
p_article->username, p_article->nickname, p_section->sname, p_section->stitle, p_article->title, BBS_name, str_sub_dt); |
| 118 |
|
|
| 119 |
snprintf(footer, sizeof(footer), |
snprintf(footer, sizeof(footer), |
| 120 |
"\n--\n%s※ 来源: %s http://%s [FROM: %s]\033[m\n\n", |
"\n--\n%s※ 来源: %s https://%s [FROM: %s]\033[m\n\n", |
| 121 |
BBS_article_footer_color[p_article->aid % BBS_article_footer_color_count], |
BBS_article_footer_color[p_article->aid % BBS_article_footer_color_count], |
| 122 |
BBS_name, BBS_server, sub_ip); |
BBS_name, BBS_server, sub_ip); |
| 123 |
|
|
| 124 |
header_len = strnlen(header, sizeof(header)); |
header_len = strnlen(header, sizeof(header)); |
| 125 |
footer_len = strnlen(footer, sizeof(footer)); |
footer_len = strnlen(footer, sizeof(footer)); |
| 126 |
|
|
| 127 |
header_line_cnt = split_data_lines(header, SCREEN_COLS, cache.line_offsets, MAX_SPLIT_FILE_LINES, 1, NULL); |
header_line_cnt = split_data_lines(header, SCREEN_COLS, cache.line_offsets, |
| 128 |
|
MAX_SPLIT_FILE_LINES, 1, NULL); |
| 129 |
|
|
| 130 |
if (header_len != cache.line_offsets[header_line_cnt]) |
if (header_len != cache.line_offsets[header_line_cnt]) |
| 131 |
{ |
{ |
| 132 |
#ifdef _DEBUG |
log_debug("Header of article(aid=%d) is truncated from %ld to %ld\n, body_line=%ld, body_line_limit=%ld", |
| 133 |
log_error("Header of article(aid=%d) is truncated from %ld to %ld\n", p_article->aid, header_len, cache.line_offsets[header_line_cnt]); |
p_article->aid, header_len, cache.line_offsets[header_line_cnt], |
| 134 |
#endif |
header_line_cnt, MAX_SPLIT_FILE_LINES); |
| 135 |
header_len = (size_t)cache.line_offsets[header_line_cnt]; |
header_len = (size_t)cache.line_offsets[header_line_cnt]; |
| 136 |
} |
} |
| 137 |
|
|
| 138 |
// Apply LML render to content body |
// Apply LML render to content body |
| 139 |
cache.data_len = header_len + (size_t)lml_render(content, content_f, ARTICLE_CONTENT_MAX_LEN, SCREEN_COLS, 0); |
body_len = (size_t)lml_render(content, content_f, ARTICLE_CONTENT_MAX_LEN, SCREEN_COLS, 0); |
| 140 |
|
cache.data_len = header_len + body_len; |
|
cache.line_total = header_line_cnt + |
|
|
split_data_lines(content_f, SCREEN_COLS + 1, cache.line_offsets + header_line_cnt, MAX_SPLIT_FILE_LINES - header_line_cnt, 1, NULL); |
|
| 141 |
|
|
| 142 |
if (cache.data_len - header_len != (size_t)cache.line_offsets[cache.line_total]) |
body_line_cnt = split_data_lines(content_f, SCREEN_COLS + 1, &(cache.line_offsets[header_line_cnt]), |
| 143 |
{ |
MAX_SPLIT_FILE_LINES - header_line_cnt, 1, NULL); |
| 144 |
#ifdef _DEBUG |
cache.line_total = header_line_cnt + body_line_cnt; |
| 145 |
log_error("Body of article(aid=%d) is truncated from %ld to %ld\n", |
|
| 146 |
p_article->aid, cache.data_len - header_len, cache.line_offsets[cache.line_total]); |
if (body_len != (size_t)cache.line_offsets[cache.line_total]) |
| 147 |
#endif |
{ |
| 148 |
|
log_debug("Body of article(aid=%d) is truncated from %ld to %ld, body_line=%ld, body_line_limit=%ld\n", |
| 149 |
|
p_article->aid, body_len, cache.line_offsets[cache.line_total], |
| 150 |
|
body_line_cnt, MAX_SPLIT_FILE_LINES - header_line_cnt); |
| 151 |
cache.data_len = header_len + (size_t)(cache.line_offsets[cache.line_total]); |
cache.data_len = header_len + (size_t)(cache.line_offsets[cache.line_total]); |
| 152 |
} |
} |
| 153 |
|
|
| 156 |
cache.line_offsets[i] += (long)header_len; |
cache.line_offsets[i] += (long)header_len; |
| 157 |
} |
} |
| 158 |
|
|
| 159 |
footer_line_cnt = split_data_lines(footer, SCREEN_COLS, cache.line_offsets + cache.line_total, MAX_SPLIT_FILE_LINES - cache.line_total, 1, NULL); |
footer_line_cnt = split_data_lines(footer, SCREEN_COLS, &(cache.line_offsets[cache.line_total]), |
| 160 |
|
MAX_SPLIT_FILE_LINES - cache.line_total, 1, NULL); |
| 161 |
|
|
| 162 |
if (footer_len != cache.line_offsets[cache.line_total + footer_line_cnt]) |
if (footer_len != cache.line_offsets[cache.line_total + footer_line_cnt]) |
| 163 |
{ |
{ |
| 164 |
#ifdef _DEBUG |
log_debug("Footer of article(aid=%d) is truncated from %ld to %ld, footer_line=%ld, footer_line_limit=%ld\n", |
| 165 |
log_error("Footer of article(aid=%d) is truncated from %ld to %ld\n", |
p_article->aid, footer_len, cache.line_offsets[cache.line_total + footer_line_cnt], |
| 166 |
p_article->aid, footer_len, cache.line_offsets[cache.line_total + footer_line_cnt]); |
footer_line_cnt, MAX_SPLIT_FILE_LINES - cache.line_total); |
|
#endif |
|
| 167 |
footer_len = (size_t)(cache.line_offsets[cache.line_total + footer_line_cnt]); |
footer_len = (size_t)(cache.line_offsets[cache.line_total + footer_line_cnt]); |
| 168 |
} |
} |
| 169 |
|
|