对于:

之前遇到VSCode的bug:
【未解决】Mac中VSCode中Command+鼠标点击无法新建markdown文件
但是无法解决。
导致需要手动操作,一个个去新建对应文件。很是麻烦。效率很低。
突然想到,可以写Python脚本实现对应功能。
去写脚本
输入:
/Users/xxx/dev/crifan/gitbook/gitbook_template/books/linux_usage_dev_summary/src/SUMMARY.md
输出:
/Users/xxx/dev/crifan/gitbook/gitbook_template/books/linux_usage_dev_summary/src/
下面建立出对应的markdown文件
且文件内部,加上对应的 一级标题:

去写python
/Users/xxx/dev/crifan/gitbook/gitbook_template/common/tools/generate_md_from_summary.py
期间遇到:
【已解决】Python文件支持运行时从命令行传入参数
继续写代码调试:

到了kill
1 2 | eachLine = * [kill](commands / process / kill.md) mdName = kill, mdPath = commands / process / kill.md |

输出:
1 | Created md: /Users/xxx/dev/crifan/gitbook/gitbook_template/books/linux_usage_dev_summary/src/commands/process/kill .md |
去看看创建的文件:

是可以创建的。
是我们希望的。
继续:
1 2 3 4 5 6 7 8 9 10 11 12 | 。。。 mdName = 数据恢复, mdPath = dev_summary / data_restore.md Created md: / Users / xxx / dev / crifan / gitbook / gitbook_template / books / linux_usage_dev_summary / src / dev_summary / data_restore.md eachLine = * [模拟Linux系统](dev_summary / emulate_linux.md) mdName = 模拟Linux系统, mdPath = dev_summary / emulate_linux.md Created md: / Users / xxx / dev / crifan / gitbook / gitbook_template / books / linux_usage_dev_summary / src / dev_summary / emulate_linux.md eachLine = * [附录](appendix / README.md) mdName = 附录, mdPath = appendix / README.md Existed md: / Users / xxx / dev / crifan / gitbook / gitbook_template / books / linux_usage_dev_summary / src / appendix / README.md eachLine = * [参考资料](appendix / reference.md) mdName = 参考资料, mdPath = appendix / reference.md Existed md: / Users / xxx / dev / crifan / gitbook / gitbook_template / books / linux_usage_dev_summary / src / appendix / reference.md |
去看看比较靠后的一个:


也是可以的。
不过,突然想到了:
额外加上功能:
当文件已存在,可以更新文件
-》使得文件最后更新时间是当前最新时间
-》且如果为了避免代码导致最后更新时间都一样,不像人工更新的,那么可以:
-》加上支持:更新的最后更新时间是,当前时间-一段时间(比如10分钟)- 当前时间
去加上参数支持
去实现:
【已解决】Python更新文件最后修改时间
【总结】
代码:
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | #!/usr/bin/python # -*- coding: utf-8 -*- """ Function: Generate gitbook markdown files from entry md file SUMMARY.md. if md existed, update md file time. Author: Crifan Li Update: 20210509 """ import argparse import os import re from datetime import datetime import random argParser = argparse.ArgumentParser() argParser.add_argument( "-f" , "--md-file" , type = str , required = True , help = "full path of entry SUMMARY.md file" ) argParser.add_argument( "--disable-update-existed-md" , action = 'store_true' , help = "disable update existed md file modification time" ) argParser.add_argument( "--enable-use-random-time" , action = 'store_false' , help = "enable use random time for update time" ) argParser.add_argument( "-r" , "--random-range" , type = int , default = 10 * 60 , help = "for random time, the range. in seconds. default 600 = 10 minutes" ) args = argParser.parse_args() # if not args.file: # raise Exception("SUMMARY.md file required !") summaryMdFullPath = args.md_file # isUpdateMdWhenExist = args.update_existed_md print ( "args.disable_update_existed_md=%s" % args.disable_update_existed_md) isUpdateMdWhenExist = not args.disable_update_existed_md isRandomUpdateTime = args.enable_use_random_time randomRange = args.random_range # # for debug # summaryMdFullPath = "/Users/xxx/dev/crifan/gitbook/gitbook_template/books/linux_usage_dev_summary/src/SUMMARY.md" # isUpdateMdWhenExist = True # isRandomUpdateTime = True # randomRange = 10 * 60 # in seconds print ( "summaryMdFullPath=%s" % summaryMdFullPath) print ( "isUpdateMdWhenExist=%s" % isUpdateMdWhenExist) print ( "isRandomUpdateTime=%s" % isRandomUpdateTime) print ( "randomRange=%s" % randomRange) bookRootPath = os.path.dirname(summaryMdFullPath) print ( "bookRootPath=%s" % bookRootPath) summaryMdLineList = open (summaryMdFullPath).readlines() # print("summaryMdLineList=%s" % summaryMdLineList) def updateFileTime(filePath, newAccessTime = None , newModificationTime = None , isAccessSameWithModif = True ): """Update file access time and modification time Args: filePath (str): file path newAccessTime (int): new file access time, float newModificationTime (int): new file modification time, float isAccessSameWithModif (bool): make access same with modification Returns: None Raises: Examples: newModificationTime=1620549707.664307 """ if ( not newAccessTime) and ( not newModificationTime): return statInfo = os.stat(filePath) # print("statInfo=%s" % statInfo) # print("statInfo.st_info=%s" % statInfo.st_info) if not newAccessTime: oldAccessTime = statInfo.st_atime # 1619490904.6651974 # print("oldAccessTime=%s" % oldAccessTime) newAccessTime = oldAccessTime if not newModificationTime: oldModificationTime = statInfo.st_mtime # 1617002149.62217 # print("oldModificationTime=%s" % oldModificationTime) newModificationTime = oldModificationTime if isAccessSameWithModif: newAccessTime = newModificationTime os.utime(filePath, (newAccessTime, newModificationTime)) summaryMdLineCount = len (summaryMdLineList) print ( "Total md line count: %d" % summaryMdLineCount) for curIdx, eachLine in enumerate (summaryMdLineList): curNum = curIdx + 1 print ( "%s %s %s" % ( "-" * 20 , curNum, "-" * 20 )) eachLine = eachLine.strip() # print("eachLine=%s" % eachLine) # * [Linux系统概述](linux_sys_overview/README.md) foundMd = re.search( "\*\s+\[(?P<mdName>[^\]]+)\]\((?P<mdPath>[\w/]+\.md)\)" , eachLine) if foundMd: mdName = foundMd.group( "mdName" ) mdPath = foundMd.group( "mdPath" ) print ( "mdName=%s, mdPath=%s" % (mdName, mdPath)) mdAbsPath = os.path.join(bookRootPath, mdPath) mdFolderPath = os.path.dirname(mdAbsPath) if mdFolderPath: os.makedirs(mdFolderPath, exist_ok = True ) if os.path.exists(mdAbsPath): # print("Existed md: %s" % mdAbsPath) print ( "Existed md: %s" % mdPath) if isUpdateMdWhenExist: curDateTime = datetime.now() # datetime.datetime(2021, 5, 9, 16, 41, 9, 399425) curTimestamp = curDateTime.timestamp() # 1620549669.399425 if isRandomUpdateTime: lessTime = random.randint( 0 , randomRange) # 13451 newModifTime = curTimestamp - lessTime # 1620554635.993749 -> 1620541184.993749 else : newModifTime = curTimestamp updateFileTime(mdAbsPath, newModificationTime = newModifTime) # print("Updated modifiy time for md: %s" % mdAbsPath) print ( "Updated modifiy time for md: %s" % mdAbsPath) else : with open (mdAbsPath, "w" ) as mdFp: titleMdStr = "# %s\n" % mdName mdFp.write(titleMdStr) # print("Created md: %s" % mdAbsPath) print ( "Created md: %s" % mdPath) |
效果:
- 没md,创建md
- 有md,(默认开启)更新文件时间
- (默认开启)且更新时间采用随机时间
- 随机时间范围默认 前10分钟~当前时间
调用方式举例:
1 2 3 4 5 6 7 8 9 10 11 | cd /Users/xxx/dev/crifan/gitbook/gitbook_template/common/tools python generate_md_from_summary.py —help python generate_md_from_summary.py --disable-update-existed-md -- enable -use-random- time -f /Users/xxx/dev/crifan/gitbook/gitbook_template/books/linux_usage_dev_summary/src/SUMMARY .md python generate_md_from_summary.py --disable-update-existed-md -f /Users/xxx/dev/crifan/gitbook/gitbook_template/books/linux_usage_dev_summary/src/SUMMARY .md python generate_md_from_summary.py -f /Users/xxx/dev/crifan/gitbook/gitbook_template/books/linux_usage_dev_summary/src/SUMMARY .md python generate_md_from_summary.py -- enable -use-random- time -r 1200 -f /Users/xxx/dev/crifan/gitbook/gitbook_template/books/linux_usage_dev_summary/src/SUMMARY .md |
最常用:
1 | python generate_md_from_summary.py -f /Users/xxx/dev/crifan/gitbook/gitbook_template/books/linux_usage_dev_summary/src/SUMMARY .md |
即可。
转载请注明:在路上 » 【已未解决】用Python从gitbook的markdown文件SUMMARY.md生成相关md文件