You need to sign in or sign up before continuing.
documentIcons.js 5.06 KB
/**
 * @description 文档图标工具函数
 * @module utils/documentIcons
 * @author Claude Code
 * @created 2026-01-31
 */

// 导入所有 SVG 图标资源
import docIcon from '@/assets/images/icon/doc/doc.svg'
import wordIcon from '@/assets/images/icon/doc/word.svg'
import xlsIcon from '@/assets/images/icon/doc/xls.svg'
import pptIcon from '@/assets/images/icon/doc/ppt.svg'
import jpegIcon from '@/assets/images/icon/doc/jpeg.svg'
import pngIcon from '@/assets/images/icon/doc/png.svg'
import mp4Icon from '@/assets/images/icon/doc/mp4.svg'
import svgIcon from '@/assets/images/icon/doc/svg.svg'
import txtIcon from '@/assets/images/icon/doc/txt.svg'
import defaultIcon from '@/assets/images/icon/doc/其他文件.svg'

/**
 * 文件扩展名到图标的映射
 * @type {Object.<string, string>}
 */
const EXTENSION_ICON_MAP = {
  // 文档类
  'pdf': docIcon,
  'doc': wordIcon,
  'docx': wordIcon,

  // 表格类
  'xls': xlsIcon,
  'xlsx': xlsIcon,

  // 演示文稿类
  'ppt': pptIcon,
  'pptx': pptIcon,

  // 图片类
  'jpg': jpegIcon,
  'jpeg': jpegIcon,
  'png': pngIcon,
  'gif': pngIcon,
  'webp': pngIcon,

  // 视频类
  'mp4': mp4Icon,
  'mov': mp4Icon,
  'avi': mp4Icon,
  'mkv': mp4Icon,

  // 矢量图类
  'svg': svgIcon,

  // 文本类
  'txt': txtIcon,
  'md': txtIcon,

  // 其他
  'zip': defaultIcon,
  'rar': defaultIcon,
  '7z': defaultIcon,
};

/**
 * 默认图标(未知文件类型)
 * @type {string}
 */
const DEFAULT_ICON = defaultIcon;

/**
 * 文件扩展名到显示标签的映射
 * @type {Object.<string, string>}
 */
const EXTENSION_LABEL_MAP = {
  'pdf': 'PDF',
  'doc': 'Word',
  'docx': 'Word',
  'xls': 'Excel',
  'xlsx': 'Excel',
  'ppt': 'PPT',
  'pptx': 'PPT',
  'jpg': 'JPG',
  'jpeg': 'JPEG',
  'png': 'PNG',
  'gif': 'GIF',
  'webp': 'WebP',
  'mp4': 'MP4',
  'mov': 'MOV',
  'avi': 'AVI',
  'mkv': 'MKV',
  'svg': 'SVG',
  'txt': 'TXT',
  'md': 'MD',
  'zip': 'ZIP',
  'rar': 'RAR',
  '7z': '7Z',
};

/**
 * 默认文件类型标签
 * @type {string}
 */
const DEFAULT_LABEL = 'DOC';

/**
 * 根据文件名获取文档图标路径
 *
 * @description 从文件名中提取扩展名,返回对应的图标路径
 * @param {string} fileName - 文件名(如:document.pdf)
 * @returns {string} 图标路径
 *
 * @example
 * getDocumentIcon('报告.pdf') // 返回 PDF 图标
 * getDocumentIcon('数据.xlsx') // 返回 Excel 图标
 * getDocumentIcon('图片.png') // 返回 PNG 图标
 */
export function getDocumentIcon(fileName) {
  if (!fileName || typeof fileName !== 'string') {
    return DEFAULT_ICON;
  }

  // 提取文件扩展名
  const lastDotIndex = fileName.lastIndexOf('.');

  // 没有扩展名或以点结尾(如 "file.")
  if (lastDotIndex === -1 || lastDotIndex === fileName.length - 1) {
    return DEFAULT_ICON;
  }

  const extension = fileName.slice(lastDotIndex + 1).toLowerCase();

  // 返回对应图标,找不到则返回默认图标
  return EXTENSION_ICON_MAP[extension] || DEFAULT_ICON;
}

/**
 * 根据文件名获取文件类型标签
 *
 * @description 从文件名中提取扩展名,返回对应的显示标签
 * @param {string} fileName - 文件名(如:document.pdf)
 * @returns {string} 文件类型标签(如:PDF、Word、Excel)
 *
 * @example
 * getDocumentLabel('报告.pdf') // 'PDF'
 * getDocumentLabel('数据.xlsx') // 'Excel'
 * getDocumentLabel('图片.png') // 'PNG'
 */
export function getDocumentLabel(fileName) {
  if (!fileName || typeof fileName !== 'string') {
    return DEFAULT_LABEL;
  }

  // 提取文件扩展名
  const lastDotIndex = fileName.lastIndexOf('.');

  // 没有扩展名或以点结尾(如 "file.")
  if (lastDotIndex === -1 || lastDotIndex === fileName.length - 1) {
    return DEFAULT_LABEL;
  }

  const extension = fileName.slice(lastDotIndex + 1).toLowerCase();

  // 返回对应标签,找不到则返回默认标签
  return EXTENSION_LABEL_MAP[extension] || DEFAULT_LABEL;
}

/**
 * 根据文件名判断是否为 PDF 文件
 *
 * @param {string} fileName - 文件名
 * @returns {boolean} 是否为 PDF 文件
 *
 * @example
 * isPDF('document.pdf') // true
 * isPDF('document.docx') // false
 */
export function isPDF(fileName) {
  const extension = fileName?.split('.').pop()?.toLowerCase();
  return extension === 'pdf';
}

/**
 * 根据文件名判断是否为图片文件
 *
 * @param {string} fileName - 文件名
 * @returns {boolean} 是否为图片文件
 *
 * @example
 * isImage('photo.jpg') // true
 * isImage('document.pdf') // false
 */
export function isImage(fileName) {
  const extension = fileName?.split('.').pop()?.toLowerCase();
  const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'];
  return imageExtensions.includes(extension);
}

/**
 * 根据文件名判断是否为视频文件
 *
 * @param {string} fileName - 文件名
 * @returns {boolean} 是否为视频文件
 *
 * @example
 * isVideo('movie.mp4') // true
 * isVideo('document.pdf') // false
 */
export function isVideo(fileName) {
  const extension = fileName?.split('.').pop()?.toLowerCase();
  const videoExtensions = ['mp4', 'mov', 'avi', 'mkv'];
  return videoExtensions.includes(extension);
}