吐槽一下CSDN博客的导入功能

经过

2021-07-19,大雨。
今天突发奇想,打算把自己电脑上的Markdown笔记上传到CSDN博客上。

第一次尝试

先尝试了导入功能:
吐槽一下CSDN博客的导入功能
导入后:
吐槽一下CSDN博客的导入功能
呃。。。难道图片相对路径不行?

第二次尝试

尝试写了个Python脚本把Markdown中的图片路径改成绝对路径:

import os
import re
import base64

NOW_PATH_DIR = 'E:\\work\\notes\\test'

def s_dir(path: str) -> None:
    '''搜索md文件'''
    global NOW_PATH_DIR
    NOW_PATH_DIR = path
    file_list = []
    dir_list = []
    for p in os.listdir(path):
        p = os.path.join(path, p)
        if os.path.isdir(p):
            dir_list.append(p)
        elif os.path.isfile(p) and p.endswith('.md'):
            file_list.append(p)
    # 先处理file,再处理dir
    for p in file_list:
        with open(p, 'r+', encoding='UTF-8') as f:
            t = f.read()
            t = change(t)
            f.seek(0)
            f.write(t)
    for p in dir_list:
        s_dir(p)

def img_absolute_process(repl: re.Match) -> str:
    '''处理图片引用,改为绝对路径'''
    s = repl.group()
    img_path = repl.group(1)
    absolute_path = os.path.join(NOW_PATH_DIR, img_path)
    return s.replace(img_path, absolute_path)

def cpp_process(repl: re.Match) -> str:
    '''适配cpp,CSDN不认识c++,只认识cpp'''
    s = repl.group()
    s = s.replace('```c++', '```cpp')
    return s

def change(md: str) -> str:
    '''格式化以适应csdn'''
    md = re.sub(r'!\[.*?\]\((.*?)\)\s+', img_absolute_process, md, flags=re.M | re.S)
    md = re.sub(r'```c\+\+.*?```', cpp_process, md, flags=re.M | re.S)
    return md


if __name__ == '__main__':
    s_dir(NOW_PATH_DIR)

吐槽一下CSDN博客的导入功能
呃。。。。。。还是不行。

第三次尝试

通过百度查到,Markdown中可以嵌入base64的图片。于是乎我又写了个脚本来适配CSDN:

import os
import re
import base64

NOW_PATH_DIR = 'E:\\work\\notes\\test'
IMG_NUM = 0

def s_dir(path: str) -> None:
    '''搜索md文件'''
    global NOW_PATH_DIR
    NOW_PATH_DIR = path
    file_list = []
    dir_list = []
    for p in os.listdir(path):
        p = os.path.join(path, p)
        if os.path.isdir(p):
            dir_list.append(p)
        elif os.path.isfile(p) and p.endswith('.md'):
            file_list.append(p)
    # 先处理file,再处理dir
    for p in file_list:
        with open(p, 'r+', encoding='UTF-8') as f:
            t = f.read()
            t = change(t)
            f.seek(0)
            f.write(t)
    for p in dir_list:
        s_dir(p)

def img_base64_process(repl: re.Match) -> str:
    '''处理图片引用,改成base64格式'''
    global IMG_NUM
    IMG_NUM += 1
    s = repl.group()
    img_path = repl.group(1)
    absolute_path = os.path.join(NOW_PATH_DIR, img_path)
    with open(absolute_path, 'rb') as f:
        image = f.read()
        img_base64 = base64.b64encode(image).decode('utf-8')
        if absolute_path.endswith('.png'):
            img_base64 = 'data:image/png;base64,' + img_base64
        elif absolute_path.endswith(('.jpg', '.jpeg')):
            img_base64 = 'data:image/jpeg;base64,' + img_base64
        else:
            img_base64 = f"data:image/{os.path.split(absolute_path)[-1].split('.')[-1]};base64," + img_base64
    return s.replace(f'({img_path})', f'[Img-{IMG_NUM}]') + '\n' + f'[Img-{IMG_NUM}]:' + img_base64 + '\n'

def img_absolute_process(repl: re.Match) -> str:
    '''处理图片引用,改成绝对路径'''
    s = repl.group()
    img_path = repl.group(1)
    absolute_path = os.path.join(NOW_PATH_DIR, img_path)
    return s.replace(img_path, absolute_path)

def cpp_process(repl: re.Match) -> str:
    '''适配cpp'''
    s = repl.group()
    s = s.replace('```c++', '```cpp')
    return s

def change(md: str) -> str:
    '''格式化以适应csdn'''
    md = re.sub(r'\!\[[^\[\]]*?\]\((.*?)\)\s+', img_base64_process, md, flags=re.M | re.S)
    md = re.sub(r'```c\+\+.*?```', cpp_process, md, flags=re.M | re.S)
    return md


if __name__ == '__main__':
    s_dir(NOW_PATH_DIR)
    print(IMG_NUM)

再次尝试上传:
吐槽一下CSDN博客的导入功能
我的图咋只显示了一半??
我猜测是没有导入完全,文章超过多少个字符就直接砍掉了。

第四次尝试

这次我试着直接把处理成base64字符串的Markdown直接通过Ctrl+C Ctrl+V复制到编辑器中:
吐槽一下CSDN博客的导入功能
好像。。。没什么区别。
估计是文章有字数限制。

写在最后

最终我放弃了,就祝愿CSDN越做越好吧。
听说Github+WordPress挺香的。

上一篇:2.QT设计爬虫电影UI.MD


下一篇:使用markdown转pdf