Files
2026-05-20 15:33:06 +08:00

187 lines
6.8 KiB
TypeScript

/**
* 拼音每日一练分组数据
* 每页 4 个部分(四宫格),每个部分聚焦一个拼音及其相关练习
*/
export interface PinyinDailyTask {
char: string; // 核心字母,如 'a'
variants: string[]; // 变体,如 ['ā', 'á', 'ǎ', 'à']
type: 'shengmu' | 'yunmu' | 'zhengti';
}
export const PINYIN_DAILY_GROUPS: PinyinDailyTask[][] = [
// Day 1: 单韵母 a o e i
[
{ char: 'a', variants: ['ā', 'á', 'ǎ', 'à'], type: 'yunmu' },
{ char: 'o', variants: ['ō', 'ó', 'ǒ', 'ò'], type: 'yunmu' },
{ char: 'e', variants: ['ē', 'é', 'ě', 'è'], type: 'yunmu' },
{ char: 'i', variants: ['ī', 'í', 'ǐ', 'ì'], type: 'yunmu' },
],
// Day 2: 单韵母 u ü + 声母 b p
[
{ char: 'u', variants: ['ū', 'ú', 'ǔ', 'ù'], type: 'yunmu' },
{ char: 'ü', variants: ['ǖ', 'ǘ', 'ǚ', 'ǜ'], type: 'yunmu' },
{ char: 'b', variants: [], type: 'shengmu' },
{ char: 'p', variants: [], type: 'shengmu' },
],
// Day 3: 声母 m f d t
[
{ char: 'm', variants: [], type: 'shengmu' },
{ char: 'f', variants: [], type: 'shengmu' },
{ char: 'd', variants: [], type: 'shengmu' },
{ char: 't', variants: [], type: 'shengmu' },
],
// Day 4: 声母 n l g k
[
{ char: 'n', variants: [], type: 'shengmu' },
{ char: 'l', variants: [], type: 'shengmu' },
{ char: 'g', variants: [], type: 'shengmu' },
{ char: 'k', variants: [], type: 'shengmu' },
],
// Day 5: 声母 h j q x
[
{ char: 'h', variants: [], type: 'shengmu' },
{ char: 'j', variants: [], type: 'shengmu' },
{ char: 'q', variants: [], type: 'shengmu' },
{ char: 'x', variants: [], type: 'shengmu' },
],
// Day 6: 声母 zh ch sh r
[
{ char: 'zh', variants: [], type: 'shengmu' },
{ char: 'ch', variants: [], type: 'shengmu' },
{ char: 'sh', variants: [], type: 'shengmu' },
{ char: 'r', variants: [], type: 'shengmu' },
],
// Day 7: 声母 z c s y
[
{ char: 'z', variants: [], type: 'shengmu' },
{ char: 'c', variants: [], type: 'shengmu' },
{ char: 's', variants: [], type: 'shengmu' },
{ char: 'y', variants: [], type: 'shengmu' },
],
// Day 8: 声母 w + 复韵母 ai ei ui
[
{ char: 'w', variants: [], type: 'shengmu' },
{ char: 'ai', variants: ['āi', 'ái', 'ǎi', 'ài'], type: 'yunmu' },
{ char: 'ei', variants: ['ēi', 'éi', 'ěi', 'èi'], type: 'yunmu' },
{ char: 'ui', variants: ['uī', 'uí', 'uǐ', 'uì'], type: 'yunmu' },
],
// Day 9: 复韵母 ao ou iu ie
[
{ char: 'ao', variants: ['āo', 'áo', 'ǎo', 'ào'], type: 'yunmu' },
{ char: 'ou', variants: ['ōu', 'óu', 'ǒu', 'òu'], type: 'yunmu' },
{ char: 'iu', variants: ['iū', 'iú', 'iǔ', 'iù'], type: 'yunmu' },
{ char: 'ie', variants: ['iē', 'ié', 'iě', 'iè'], type: 'yunmu' },
],
// Day 10: 复韵母 üe er + 前鼻韵母 an en
[
{ char: 'üe', variants: ['üē', 'üé', 'üě', 'üè'], type: 'yunmu' },
{ char: 'er', variants: ['ēr', 'ér', 'ěr', 'èr'], type: 'yunmu' },
{ char: 'an', variants: ['ān', 'án', 'ǎn', 'àn'], type: 'yunmu' },
{ char: 'en', variants: ['ēn', 'én', 'ěn', 'èn'], type: 'yunmu' },
],
// Day 11: 前鼻韵母 in un ün + 后鼻韵母 ang
[
{ char: 'in', variants: ['īn', 'ín', 'ǐn', 'ìn'], type: 'yunmu' },
{ char: 'un', variants: ['ūn', 'ún', 'ǔn', 'ùn'], type: 'yunmu' },
{ char: 'ün', variants: ['ǖn', 'ǘn', 'ǚn', 'ǜn'], type: 'yunmu' },
{ char: 'ang', variants: ['āng', 'áng', 'ǎng', 'àng'], type: 'yunmu' },
],
// Day 12: 后鼻韵母 eng ing ong + 整体认读 zhi
[
{ char: 'eng', variants: ['ēng', 'éng', 'ěng', 'èng'], type: 'yunmu' },
{ char: 'ing', variants: ['īng', 'íng', 'ǐng', 'ìng'], type: 'yunmu' },
{ char: 'ong', variants: ['ōng', 'óng', 'ǒng', 'òng'], type: 'yunmu' },
{
char: 'zhi',
variants: ['zhī', 'zhí', 'zhǐ', 'zhì'],
type: 'zhengti',
},
],
// Day 13: 整体认读 chi shi ri zi
[
{
char: 'chi',
variants: ['chī', 'chí', 'chǐ', 'chì'],
type: 'zhengti',
},
{
char: 'shi',
variants: ['shī', 'shí', 'shǐ', 'shì'],
type: 'zhengti',
},
{ char: 'ri', variants: ['rī', 'rí', 'rǐ', 'rì'], type: 'zhengti' },
{ char: 'zi', variants: ['zī', 'zí', 'zǐ', 'zì'], type: 'zhengti' },
],
// Day 14: 整体认读 ci si yi wu
[
{ char: 'ci', variants: ['cī', 'cí', 'cǐ', 'cì'], type: 'zhengti' },
{ char: 'si', variants: ['sī', 'sí', 'sǐ', 'sì'], type: 'zhengti' },
{ char: 'yi', variants: ['yī', 'yí', 'yǐ', 'yì'], type: 'zhengti' },
{ char: 'wu', variants: ['wū', 'wú', 'wǔ', 'wù'], type: 'zhengti' },
],
// Day 15: 整体认读 yu ye yue yuan
[
{ char: 'yu', variants: ['yū', 'yú', 'yǔ', 'yù'], type: 'zhengti' },
{ char: 'ye', variants: ['yē', 'yé', 'yě', 'yè'], type: 'zhengti' },
{
char: 'yue',
variants: ['yuē', 'yué', 'yuě', 'yuè'],
type: 'zhengti',
},
{
char: 'yuan',
variants: ['yuān', 'yuán', 'yuǎn', 'yuàn'],
type: 'zhengti',
},
],
// Day 16: 整体认读 yin yun ying
[
{
char: 'yin',
variants: ['yīn', 'yín', 'yǐn', 'yìn'],
type: 'zhengti',
},
{
char: 'yun',
variants: ['yūn', 'yún', 'yǔn', 'yùn'],
type: 'zhengti',
},
{
char: 'ying',
variants: ['yīng', 'yíng', 'yǐng', 'yìng'],
type: 'zhengti',
},
],
];
/** 每日打卡选择器展示项 */
export interface PinyinDailyPickerItem {
index: number;
label: string;
subtitle: string;
}
const CHIP_CHAR_MAX = 3;
const CHIP_SUBTITLE_MAX = 14;
function shortCharForChip(char: string): string {
if (char.length <= CHIP_CHAR_MAX) return char;
return `${char.slice(0, CHIP_CHAR_MAX - 1)}…`;
}
/** 构建「第 N 组 + 拼音摘要」选择器数据 */
export function buildPinyinDailyPickerItems(): PinyinDailyPickerItem[] {
return PINYIN_DAILY_GROUPS.map((group, idx) => {
let subtitle = group.map((t) => shortCharForChip(t.char)).join('·');
if (subtitle.length > CHIP_SUBTITLE_MAX) {
subtitle = `${subtitle.slice(0, CHIP_SUBTITLE_MAX - 1)}…`;
}
return {
index: idx,
label: `第 ${idx + 1} 组`,
subtitle,
};
});
}