1. 配置模块python
默认配置,
markdown
用户自定义配置,spa
命令行配置命令行
优先级从地到高code
resolved_egrc_path = get_priority(args.egrc_path, '~/.egrc', None) egrc_config = get_config_tuple_from_egrc(resolved_egrc_path)
获得的egrc_config配置,
字符串
而后和命令行,默认配置遗弃比较。get
resolved_examples_dir = get_priority( args.examples_dir, egrc_config.examples_dir, DEFAULT_EXAMPLES_DIR )
color_config有点特殊,
cmd
color_config = None if resolved_use_color: default_color_config = get_default_color_config() color_config = merge_color_configs( egrc_config.color_config, default_color_config )
而后得出最后解析的config,string
result = Config( examples_dir=resolved_examples_dir, custom_dir=resolved_custom_dir, color_config=color_config, use_color=resolved_use_color, pager_cmd=resolved_pager_cmd )
2. 寻找命令文件
it
会从两个目录下分别找相应的markdown文件。
example_dir, custome_dir
def has_default_entry_for_program(program, config): """Return True if has standard examples for program, else False.""" if config.examples_dir: file_path = get_file_path_for_program( program, config.examples_dir ) return os.path.isfile(file_path) else: return False
经过将program加'.md'字符串, os.path.isfile判断是否存在。
file_data = '' if custom_file_path: file_data += _get_contents_of_file(custom_file_path) if default_file_path: file_data += _get_contents_of_file(default_file_path) if use_color: colorizer = color.EgColorizer(color_config) file_data = colorizer.colorize_text(file_data) page_string(file_data, pager_cmd)
直接读取文件内容, 最后调用colorizer将文本彩色画。
3. 文本彩色化
def colorize_heading(self, text): return self._color_helper( text, '(^#+)(.*)$', ( self.color_config.pound + r'\1' + self.color_config.pound_reset + self.color_config.heading + r'\2' + self.color_config.heading_reset ) ) def _color_helper(self, text, pattern, repl): # < 2.7 didn't have the flags named argument. if sys.version_info[1] < 7: compiled_pattern = re.compile(pattern, re.MULTILINE) return re.sub( compiled_pattern, repl, text ) else: return re.sub( pattern, repl, text, flags=re.MULTILINE )
彩色画文本,实质上是将某些文本先后加上特定字符串,输出就达到彩色的效果。
以colorize_heading为例,是调用re.sub,用正则匹配,而后添加特定字符串。
这里re.sub的用法比较特殊, 使用了'\1', '\2',表示以前的捕获组