File size: 3,058 Bytes
e1ae2c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**
 * Handlebars格式化助手函数
 * 提供日期、文本等格式化功能
 */

/**
 * 格式化日期
 * @param {Date|string} date 日期对象或日期字符串
 * @param {string} format 格式化模式
 * @returns {string} 格式化后的日期字符串
 * @example {{formatDate date "YYYY-MM-DD"}}
 */
function formatDate(date, format) {
  if (!date) return '';

  // 将字符串转换为日期对象
  const dateObj = typeof date === 'string' ? new Date(date) : date;

  if (!(dateObj instanceof Date) || isNaN(dateObj)) {
    return '';
  }

  // 获取日期组件
  const year = dateObj.getFullYear();
  const month = dateObj.getMonth() + 1;
  const day = dateObj.getDate();
  const hours = dateObj.getHours();
  const minutes = dateObj.getMinutes();
  const seconds = dateObj.getSeconds();

  // 格式化日期字符串
  if (!format) format = 'YYYY-MM-DD';

  return format
    .replace('YYYY', year)
    .replace('MM', month.toString().padStart(2, '0'))
    .replace('DD', day.toString().padStart(2, '0'))
    .replace('HH', hours.toString().padStart(2, '0'))
    .replace('mm', minutes.toString().padStart(2, '0'))
    .replace('ss', seconds.toString().padStart(2, '0'));
}

/**
 * 限制文本长度,超出部分显示省略号
 * @param {string} text 输入文本
 * @param {number} length 最大长度
 * @returns {string} 处理后的文本
 * @example {{limit description 100}}
 */
function limit(text, length) {
  if (!text) return '';

  text = String(text);

  if (text.length <= length) {
    return text;
  }

  return text.substring(0, length) + '...';
}

/**
 * 转换文本为小写
 * @param {string} text 输入文本
 * @returns {string} 小写文本
 * @example {{toLowerCase title}}
 */
function toLowerCase(text) {
  if (!text) return '';
  return String(text).toLowerCase();
}

/**
 * 转换文本为大写
 * @param {string} text 输入文本
 * @returns {string} 大写文本
 * @example {{toUpperCase code}}
 */
function toUpperCase(text) {
  if (!text) return '';
  return String(text).toUpperCase();
}

/**
 * 将对象转换为JSON字符串(用于调试)
 * @param {any} obj 要转换的对象
 * @returns {string} JSON字符串
 * @example {{json this}}
 */
function json(obj) {
  return JSON.stringify(obj, null, 2);
}

/**
 * 从URL中提取干净的域名
 * @param {string} url 完整URL
 * @returns {string} 提取的域名(不包含协议和尾部斜杠)
 * @example {{extractDomain "https://app.follow.is/"}} => "app.follow.is"
 */
function extractDomain(url) {
  if (!url) return '';

  try {
    // 移除协议部分 (http://, https://, etc.)
    let domain = String(url).replace(/^[a-zA-Z]+:\/\//, '');

    // 移除路径、查询参数和锚点
    domain = domain.split('/')[0].split('?')[0].split('#')[0];

    // 移除端口号(如果有)
    domain = domain.split(':')[0];

    return domain;
  } catch (e) {
    return String(url);
  }
}

// 导出所有格式化助手函数
module.exports = {
  formatDate,
  limit,
  toLowerCase,
  toUpperCase,
  json,
  extractDomain,
};