Meekdai / Gmeek

Gmeek is a Blog All in Github
https://meekdai.github.io
MIT License
1.56k stars 223 forks source link

文章标题中含有半角冒号时,仓库无法在 Windows 中克隆 #39

Closed amorphobia closed 5 months ago

amorphobia commented 6 months ago

这样生成的 html 文件名中含也有半角冒号,而 Windows 的文件系统不允许半角冒号存在

Meekdai commented 6 months ago

@amorphobia 是的,目前一些特性的符号还存在一些BUG,除了半角冒号还有/也会导致出现问题。 第一种解决办法是在标题中不使用这些特殊的符号。 第二种解决办法是通过config.json配置urlModeissue

aldehyde-rcho commented 6 months ago

想要着手来改这个bug 我在这个链接找到了一个函数可以解决命名问题:

def is_valid_folder_name(name: str):
    # Define a regular expression pattern to match forbidden characters
    ILLEGAL_NTFS_CHARS = r'[<>:/\\|?*\"]|[\0-\31]'
    # Define a list of forbidden names
    FORBIDDEN_NAMES = ['CON', 'PRN', 'AUX', 'NUL',
                       'COM1', 'COM2', 'COM3', 'COM4', 'COM5',
                       'COM6', 'COM7', 'COM8', 'COM9',
                       'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5',
                       'LPT6', 'LPT7', 'LPT8', 'LPT9']
    # Check for forbidden characters
    match = re.search(ILLEGAL_NTFS_CHARS, name)
    if match:
        raise ValueError(
            f"Invalid character {match[0]} for filename {name}")
    # Check for forbidden names
    if name.upper() in FORBIDDEN_NAMES:
        raise ValueError(f"{name} is a reserved folder name in windows")
    # Check for empty name (disallowed in Windows)
    if name.strip() == "":
        raise ValueError("Empty file name not allowed in Windows")
    # Check for names starting or ending with dot or space
    match = re.match(r'^[. ]|.*[. ]$', name)
    if match:
        raise ValueError(
            f"Invalid start or end character ({match[0]})"
            f" in folder name {name}"
        )

从issue中直接导出的md文件名称也可能存在不合法的符号,所以那边的文件名应该也要修改。目前想法是把所有的非法字符改成-


edit: 我想复杂了,只要这样做就可以:

def clean_invalid_chars(name:str):
    cleaned_name=name
    ILLEGAL_NTFS_CHARS = r'[<>:/\\|?*\"]|[\0-\31]'
    FORBIDDEN_NAMES = ['CON', 'PRN', 'AUX', 'NUL',
                    'COM1', 'COM2', 'COM3', 'COM4', 'COM5',
                    'COM6', 'COM7', 'COM8', 'COM9',
                    'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5',
                    'LPT6', 'LPT7', 'LPT8', 'LPT9']
    if name.upper() in FORBIDDEN_NAMES:
        cleaned_name=name+'-'

    cleaned_name=re.sub(ILLEGAL_NTFS_CHARS,'-',cleaned_name)
    return cleaned_name
Meekdai commented 6 months ago

@aldehyde-rcho 感谢,有空我会测试一下,解决这个BUG

Meekdai commented 5 months ago

@amorphobia @aldehyde-rcho 新版本v2.15 目前已经修复特殊符号的BUG,具体可看更新日志,以及快速上手