Files
Lu Fan(SonnyCalcr) b391fd616b feat: T 模式支持输入指定的日期和时间 (#626)
Shift+T 后面除了 rq / sj / xq 唤醒词,还可以直接写数字:

- YYYYMMDD、YYYY/M/D、M/D(年份取今年)出那一天的日期格式,星期按那一天算
- YYYY/M 出年月格式(新增 date:ym_* 五种)
- h:mm、h:mm:ss 出时间格式,写了秒才给带秒的格式
- YYYYMMDDhh[:mm[:ss]] 出日期加时间的格式

指定的日期时间沿用唤醒词的格式 ID,学到的顺序、置顶、固定位置跟着走。

输入形状放在 engine/contracts/date_time_input.h,TSF、Server、引擎共用:
数字、/ 和 : 只在还能接成某种形状时才进输入串,接不上的数字仍是选词键,
/ 和 : 仍是标点,Shift+数字始终选词。小键盘数字同样可以输入。

Refs #531
2026-10-05 03:42:12 +08:00

44 lines
2.2 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
#include "../core/word_item.h"
#include <string>
#include <vector>
namespace metasequoia::local_modes
{
struct LocalDateTime
{
unsigned year = 0;
unsigned month = 0;
unsigned day = 0;
unsigned weekday = 0;
unsigned hour = 0;
unsigned minute = 0;
unsigned second = 0;
};
LocalDateTime current_local_date_time();
bool is_date_time_keyword(const std::string &keyword);
// Shift+T 后面那一串(不含 T)出得了候选:是唤醒词,或者是写完了、取值也对的指定日期时间
// (20241225、2024/12/25、12/25、14:30 等,形状见 contracts/date_time_input.h)。只写月日时年份取 now 的。
bool is_date_time_query(const std::string &input, const LocalDateTime *now = nullptr);
// input 是唤醒词时按 now 出整组格式,是指定的日期时间时只出写到了的部分:只写日期不给带时分的格式,
// 只写年月只给年月的几种,写了秒就不给丢掉秒的格式。
// 每条候选的 WordItem::pinyin 是它的格式 ID(如 "date:ymd_dash")。调频、置顶、固定位置都按格式 ID
// 记:日期文本每天都变,按文字记,明天就对不上了。指定的日期时间沿用同一套 ID,和唤醒词共用学到的顺序。
std::vector<WordItem> query_date_time(const std::string &input, const LocalDateTime *now = nullptr, int limit = 17);
// 所属的一组格式:"date" / "time" / "week",都不是时为空。rq / riqi / date 同属一组,共用一份学到的
// 顺序;指定的日期归 "date",指定的时间和日期加时间归 "time"。
std::string date_time_category(const std::string &input);
// 这组格式的全部 ID,按出厂顺序。包括此刻给不出文本、query_date_time 跳过的那些。
std::vector<std::string> date_time_format_ids(const std::string &keyword);
// 混输里展开全部格式的那个入口候选。它不上屏:选中时候选框换成 query_date_time 的整组格式。
// pinyin 是前缀加唤醒词,展开时据此重查。
inline constexpr const char *kDateTimeMenuPrefix = "menu:";
WordItem date_time_menu_item(const std::string &keyword);
bool is_date_time_menu_item(const WordItem &item);
std::string date_time_menu_keyword(const WordItem &item);
} // namespace metasequoia::local_modes