| 1 |
/*************************************************************************** |
/* SPDX-License-Identifier: GPL-3.0-or-later */ |
| 2 |
article_cache.c - description |
/* |
| 3 |
------------------- |
* article_cache |
| 4 |
Copyright : (C) 2004-2025 by Leaflet |
* - convert article content from DB to local cache with LML conversion and line offset index |
| 5 |
Email : leaflet@leafok.com |
* |
| 6 |
***************************************************************************/ |
* Copyright (C) 2004-2025 Leaflet <leaflet@leafok.com> |
| 7 |
|
*/ |
| 8 |
/*************************************************************************** |
|
| 9 |
* * |
#ifdef HAVE_CONFIG_H |
| 10 |
* This program is free software; you can redistribute it and/or modify * |
#include "config.h" |
| 11 |
* it under the terms of the GNU General Public License as published by * |
#endif |
|
* the Free Software Foundation; either version 3 of the License, or * |
|
|
* (at your option) any later version. * |
|
|
* * |
|
|
***************************************************************************/ |
|
| 12 |
|
|
| 13 |
#include "article_cache.h" |
#include "article_cache.h" |
| 14 |
#include "lml.h" |
#include "lml.h" |
| 23 |
#include <sys/mman.h> |
#include <sys/mman.h> |
| 24 |
#include <sys/stat.h> |
#include <sys/stat.h> |
| 25 |
|
|
| 26 |
#define ARTICLE_HEADER_MAX_LEN 4096 |
enum _article_cache_constant_t |
| 27 |
#define ARTICLE_CONTENT_MAX_LEN 1024 * 1024 * 4 // 4MB |
{ |
| 28 |
#define ARTICLE_FOOTER_MAX_LEN 4096 |
ARTICLE_HEADER_MAX_LEN = 4096, |
| 29 |
#define SUB_DT_MAX_LEN 50 |
ARTICLE_FOOTER_MAX_LEN = 4096, |
| 30 |
|
SUB_DT_MAX_LEN = 50, |
| 31 |
|
}; |
| 32 |
|
|
| 33 |
static const char *BBS_article_footer_color[] = { |
static const char *BBS_article_footer_color[] = { |
| 34 |
"\033[31m", |
"\033[31m", |
| 109 |
|
|
| 110 |
// Generate article header / footer |
// Generate article header / footer |
| 111 |
localtime_r(&(p_article->sub_dt), &tm_sub_dt); |
localtime_r(&(p_article->sub_dt), &tm_sub_dt); |
| 112 |
strftime(str_sub_dt, sizeof(str_sub_dt), "%c", &tm_sub_dt); |
strftime(str_sub_dt, sizeof(str_sub_dt), "%c %Z", &tm_sub_dt); |
| 113 |
|
|
| 114 |
snprintf(header, sizeof(header), "发布者: %s (%s), 版块: %s (%s)\n标 题: %s\n发布于: %s (%s)\n\n", |
snprintf(header, sizeof(header), "发布者: %s (%s), 版块: %s (%s)\n标 题: %s\n发布于: %s (%s)\n\n", |
| 115 |
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); |
| 133 |
} |
} |
| 134 |
|
|
| 135 |
// Apply LML render to content body |
// Apply LML render to content body |
| 136 |
cache.data_len = header_len + (size_t)lml_render(content, content_f, ARTICLE_CONTENT_MAX_LEN, 1); |
cache.data_len = header_len + (size_t)lml_render(content, content_f, ARTICLE_CONTENT_MAX_LEN, SCREEN_COLS, 0); |
| 137 |
|
|
| 138 |
cache.line_total = header_line_cnt + |
cache.line_total = header_line_cnt + |
| 139 |
split_data_lines(content_f, SCREEN_COLS, cache.line_offsets + header_line_cnt, MAX_SPLIT_FILE_LINES - header_line_cnt, 1, NULL); |
split_data_lines(content_f, SCREEN_COLS + 1, cache.line_offsets + header_line_cnt, MAX_SPLIT_FILE_LINES - header_line_cnt, 1, NULL); |
| 140 |
|
|
| 141 |
if (cache.data_len - header_len != (size_t)cache.line_offsets[cache.line_total]) |
if (cache.data_len - header_len != (size_t)cache.line_offsets[cache.line_total]) |
| 142 |
{ |
{ |